CTF靶机入门-ssh私钥泄露

Author: 张浩森 Date: Jun 29, 2018 Updated On: Jul 6, 2018
Categories:
Tags:

CTF靶机入门-ssh私钥泄露

这个靶机应该是CTF靶机的最基础的入门了,但是里面还是涉及到一些以前没有接触到过的知识,所以总结了一下,也是对自己常用的ssh远程登录工具做一个更深层次的理解。

一、ssh远程登录工具(from wap.baike)

ssh是一个安全的远程会话和其他网络服务工具,比传统意义上的ftp和pop3等等协议来的安全的多。它主要有以下两种安全等级。

第一种级别(基于口令的安全验证)

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。这里加一下我的具体解释,就是比如我的电脑要ssh口令登陆这个网站的服务器,ssh 用户名@www.abigale.xin,如果是第一次登陆,服务器首先会把它的公钥发给我的电脑,我的电脑会用这个公钥加密它所知道的口令传给服务器,服务器再用自己的私钥进行解密,对比成功就可以重新连接。但是假如出现了一个中间人,伪造我的电脑想要登陆的本网站,我的电脑由于分不清楚,所以就用伪造的公钥加密了密码,发给了这个中间人,中间人用自己的私钥解密了这个密码,就相当于获得了本站的密码,那将是非常危险的。所以为了解决这个问题有了下面的方案。

第二种级别(基于密匙的安全验证)

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

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

第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。

先解释一下基于密钥的安全验证,举个和本站服务器通信的例子:

总结以上的说法,ssh的核心的保证安全方式是基于密钥的安全验证,也就是说用我们熟知的非对称加密算法如RSA或者DSA算法来进行安全的保证,而且数据在传输过程中都是被加密的。比如我的电脑想要用ssh工具远程登录我这个网站的服务器,就要敲命令:ssh 用户名@www.abigale.xin,而且,www.abigale.xin这个主机上必须存有我的电脑的公钥。就像上面所说,我的电脑首先请求连接,发送公钥给服务器,服务器那边首先作对比找之前存在上面的我的电脑的公钥,并用存在上面的我的电脑的公钥加密一个challenge,发给我的电脑,然后我的电脑再用自己私钥进行解密,再发送给服务器进行认证,就说明了我的电脑的身份是合法的。还有一种说法是,假如我的电脑请求连接,服务器会先发送一个challenge给我的电脑,我的电脑用自己的私钥加密这个challenge之后发给服务器,服务器再用之前存储的我的电脑的公钥进行解密这个challenge,如果对比成功就可以成功登陆。

在此CTF靶机中,预定的漏洞是泄露靶机服务器的私钥。大致思路应该是如下的:

(1)扫描靶机中开启web服务可以访问到的文件,寻找泄露的ssh私钥。

(2)寻找可以登录的用户名,尝试进行登录。如果不是拥有root权限的用户,看看是否有办法进行提权。

(3)渗透靶机的过程中尽量寻找flag。

(4)终极目标是拿到靶机的root权限。

但是整个过程下来还是有很多地方不明白,

(1)利用字典和私钥破解密码,私钥会包含密码信息吗,应该是加密后的密码才包含密码信息才对,这里没有想通。

(2)authorized_keys文件里的用户名为何就是ssh要登录的用户名。可能是因为之前的登陆是用了ssh www.abigale.xin的命令,此登陆的用户名是与登陆主机相同的用户名,这个可能就是simon用户。

下面是靶机渗透的过程,会把全部用到的Linux知识记录下来,方便以后查阅。

二、渗透靶机的过程

ifconfig查一下ip,看一下子网掩码,192.168.150.255,所以扫192.168.150.0/24

QQ20180629-212724

kali和靶机都放在vmware里,先netdiscover -r 192.168.153.0/24扫一下内网,找到靶机的ip

namp神器开路,扫一下看看开了什么服务

QQ20180629-212608

Mac地址能看出来,靶机的ip是192.168.150.129

namp扫出来发现有一个大端口用python开启了http服务。这里应该就是突破口。大端口开放http服务一般是不安全的。而且发现22端口开启了ssh,是我们可以利用的。

既然知道了大端口31337开启了http服务,因此dirb扫一下看看能扫出什么文件。

QQ20180629-212657

扫出来这些文件。根据思考感觉可以利用的是.ssh文件夹里的内容和robots.txt。

Tip:robots.txt

1
搜索引擎使用spider程序自动访问互联网上的网页并获取网页信息。spider在访问一个网站时,会首先会检查该网站的根域下是否有一个叫做robots.txt的纯文本文件。您可以在您的网站中创建一个纯文本文件robots.txt,在文件中声明该网站中不想被robot访问的部分或者指定搜索引擎只收录特定的部分。其实就是个黑名单和白名单文件。

了解了robots.txt文件的作用之后,我们先通过浏览器访问一下,访问http://192.168.150.129:31337/robots.txt:

QQ截图20180629204730

发现有3个黑名单文件。前两个应该没啥用,看一下/taxes文件有什么:

QQ截图20180629204757

有flag,get第一个flag1。

然后继续找其他的flag。由于是ssh私钥泄露,所以看一下.ssh文件夹里有什么文件:

QQ截图20180629204828

一共有三个文件。id_rsa是靶机的私钥,无格式文件。id_rsa.pub是公钥。authorized_keys存放的是要连接主机的公钥,可以实现免密登陆,也就是密钥安全验证登陆。先把这三个文件下载下来,通过url访问文件即可下载。

QQ截图20180629205014

下载下来后,后续步骤需要我们做一定的思考。得到了这三个文件,我们如何利用?

id_rsa和id_rsa.pub这两个文件里内容就是钥匙的内容。cat了一下公钥和authrized_keys文件,发现两个文件中的内容是一样的。因此靶机上存储的公钥对应的私钥就是id_rsa,利用上面已经讲过的原理我们可以用id_rsa私钥进行进行一个免密登陆。

首先给私钥赋权限,600权限,cat查看一下内容。为什么赋予600权限呢?对于一个非目录文件的600权限代表的意思是- r w - - - - - -,意思就是只有本用户有r和w权限,即可读可写权限,用户组和其他用户组的人对此文件都没有rwx权限。因为ssh工具里限制了登陆的私钥文件必须只有本用户有相应的权限,r w x都可以,用户组里的其他用户和其他用户组的用户都不能对此私钥文件有任何的r w x权限,否则会拒绝使用此私钥登陆。

QQ截图20180705211040

这里就是给id_rsa私钥文件赋予了其他用户可读或者可写或者可执行的权限,这样的私钥文件在ssh中是不可用的,其他用户必须没有任何权限才可用。

下面权限赋成600,即-r w - - - - - - -

QQ截图20180629205145

QQ截图20180629205304

然后发现用户名是simon。这个用户名应该是主动登陆主机的用户名。如果主动登陆主机的用的是ssh www.abigale.xin的没有加用户名的命令,那么被登陆服务器肯定有一个也叫simon的用户名。所以此时可以利用ssh -i id_rsa simon@192.168.150.129来试探进行免密登陆。-i的作用是指定身份文件。这里指定的就是靶机泄露的私钥文件。

QQ截图20180629205343

但是试探登陆发现还是需要输入登陆的口令,看来这里是设置了私钥的密码。ssh工具中应该是可以设置此项功能的,也就是利用密钥进行身份认证登陆的时候

所以接下来的任务就是想办法找到密码了。首先记录一下kali中自带的密码字典文件和破解密码用的john工具

Tip:john密码工具

1
John the ripper是一款大受欢迎的、基于字典的密码破解工具。它使用内容全是密码的单词表,然后使用单词表中的每一个密码,试图破解某个特定的密码散列。换句话说,它又叫蛮力密码破解,这是一种最基本的密码破解方式。不过它也是最耗费时间、最耗费处理器资源的一种方法。尝试的密码越多,所需的时间就越长。

john是一个密码破解工具,可以破解哈希过后的密码。破解后的密码会全部记录在john.pot文件里。可以在根目录下用find -name john.pot寻找一下这个文件。这里先不记录john的使用方法。

kali中有一些自带的密码字典文件,都放在了/usr/share/wordlists目录下。这个目录下有很多常用的密码字典文件。本次破解私钥的密码用的是这个目录下的rockyou.txt.gz的密码字典。

kali还有一个ssh2john工具,是将ssh的密钥文件转化成john工具可识别的格式。下图记录了破解具体过程。

zcat命令是将未解压文件中的内容输出在终端,|符号是将上一条命令的输出作为下一条命令的输入,所以图片的中的第一条命令的意思就是把那个压缩字典文件中的内容做作为输入传到john命令中,指定字典进行私钥文件的破解。破解出来的密码是starwars。

QQ截图20180705192326

然后我们用simon用户名和刚刚破解出来的密码进行登陆。

QQ截图20180629210809

登陆成功了!然后ls看看有没有flag文件。然后到/root目录下查看一下有没有flag文件。

QQ截图20180629210838

有刚才利用浏览器登陆的robots.txt文件。/root文件夹下有一个flag.txt文件,但是simon用户没有权限查看。所以下一部的工作就是想办法提权。

ls发现/root目录下有一个read_message.c文件。cat一下发现是一个有缓冲区溢出漏洞的程序。而且这个文件中有flag2。这个文件simon用户是可读的。

QQ截图20180629211011

首先分析一下这个漏洞程序:让我们输入的是buf[20]数组,从下面的if else结构中可以看出,我们输入的前五个字符应该是Simon,然后会执行/usr/local/sbin/message这个程序。

其实经过查看,对read_message.c文件simon用户只有可读权限,没有可写和可执行权限。所以这里用gcc编译此文件利用缓冲区溢出漏洞来提权是不可行的。不过这里肯定是利用这个缓冲区溢出漏洞,所以这台靶机中应该是有由read_message.c编译来的可执行文件或者直接可以运行的软件。

这里我们可以通过查看/usr/local/bin目录下看看有没有与read_message.c相关的可用软件。

Tip:/usr/bin目录和/usr/local/bin目录:

1
2
3
4
usr 指 Unix System Resource,而不是User
然后通常/usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变
/usr/local/bin目录是给用户放置自己的可执行程序的地方,推荐放在这里,不会被系统升级而覆盖同名文件
usr 指 Unix System Resource,/usr 目录包含所有的命令、程序库、文档和其它文件,我们可以命令到这个目录下,ls -al看下,都是系统预装的可执行程序,会随着系统的升级而改变,/usr/local/bin目录是给用户放置自己的可执行程序,所以我们一般把我们可执行的脚本文件放到这个目录,这样我们在linux系统里面任何目录都可以运行了,比如我们Android开发的时候把pidcat.py文件放到这个目录下面,我们从其它地方拷贝到这个目录的时候,要记得加上sudo,需要管理员权限。

这里的意思就是,/usr/bin下存放的系统已经安装好的可执行程序,不是用户自己安装的。而用户自己安装的在/usr/local/bin下,这里有用户自己安装的可执行程序。我们进入到这个目录下查看一下:

QQ截图20180705234007

发现确实有一个read_message的可执行软件,而且simon对此软件也有可执行权限。所以我们执行以下这个软件,直接敲read_message命令就好:

QQ截图20180629211104

然后我们利用缓冲区溢出漏洞,这里其实最最基础的二进制漏洞,之前写过以前JOP攻击的文章可以参考,相对难一些。这里我们输入字符SimonAAAAAAAAAAAAAAA/bin/sh就可以获得root权限了:

QQ截图20180629211319

然后我们cat flag文件就可以获得flag了。最终靶机渗透结束

三、总结一下此次入门渗透靶机学到的知识:

(1)ssh远程登录工具的原理以及相应密钥文件的使用;

(2)探测网络环境用到的工具,netdiscover、nmap、dirb;

(3)kali中的ssh2john、john和自带的字典文件等密码工具的使用;

(4)Linux中/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/local/sbin的相同和不同之处;

(5)Linux文件权限的概念以及原理,以及用户、用户组和other的概念;

refer:

https://blog.csdn.net/test1280/article/details/70143465

https://www.cnblogs.com/lishihai/p/7986565.html