Aggregator
福利 | 2019京麒国际安全峰会即将开幕
The One Thing You Can't Outsource: Risk
Fake Cozy Bear Group Making DDoS Extortion Demands
In Conversation: Successful Women
被好友嫌弃拉黑?这一招绝地反杀你一定不知道!
来到乙方的这六个月
控制python随机数
起因是看到v2ex有人发了个送E卡的推广 https://www.v2ex.com/t/618739#reply392 里面有说抽奖的方式
1 2 3 4 5 6 import random seed = [第 300 楼的用户 ID] random.seed(seed) print(sorted(random.sample(range(1, 300), 5)))选择第300楼的用户名作为种子,然后抽奖 一般来说,种子确定了,生成的随机数的序列就确定了。 python2 3之间生成序列不同,但是 python2或python3自己的小版本内序列是相同的
那么能否控制中奖楼层呢?
attack第300楼的用户ID是唯一的输入,而这个 ID是可以控制的,可以注册一个用户名,在第300楼回复即可。顺手写了个脚本来爆破可以生成指定中奖楼层的种子的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #!/usr/bin/env python # coding: utf-8 # In[5]: import random import string from itertools import product # In[96]: def find(seed, target): random.seed(seed) t = random.sample(range(1,300), 5) c = 0 for i in target: if i in t: c += 1 return c == len(target) # In[100]: count = 1 result = [] asc = string.ascii_letters+string.digits for s in product(asc, repeat=15): count += 1 if not count%100000: print("count: {:,d}".format(count)) s = "".join(s) if find(s, [1,2, 3,4]): # print(s) print(count, s) result.append(s) break # In[95]: print(set(result)) for seed in set(result): random.seed(seed) print(random.sample(range(1,300),5))这是计算密集型,可以多进程,但是我是丢到服务器上跑的,只有一个CPU :) 所以就单进程吧
result秒速爆破出来可以生成包含1,2,3位指定数字的种子
1 # trafbpcszonjeil hpscybwevjuzlkr 生成 1,2,3三十分钟跑到了可以生成包含四位指定随机数的种子 [1,2,3,4]
1 2 3 4 5 6 7 8 9 In [1]: seed = 'aaaaaaaaaaeNWk4' In [2]: import random In [3]: random.seed(seed) In [4]: random.sample(range(1,300),5) Out[4]: [1, 59, 3, 2, 4]ATT&CK 实战指南
WebFuzzing方法和漏洞案例总结
作者:Vulkey_Chen
博客:gh0st.cn
背景之前有幸做过一次线下的议题分享《我的Web应用安全模糊测试之路》,讲解了一些常用的WebFuzzing技巧和案例,该议题得到了很大的回响,很多师傅们也与我进行了交流,但考虑到之前分享过很多思路非常不全面,这里以本篇文章作为一次总结,以实战引出技巧思路(方法)。
我的Web应用安全模糊测试之路议题解读:https://gh0st.cn/archives/2018-07-25/1 (推荐阅读)
实战案例以下分享的案例都是个人在参与项目或私密众测邀请时遇见的真实案例,案例大多基于个人收集和整理的FuzzDict项目(字典库)。
其中涉及的一些漏洞可能无法作为Fuzzing归类,这里也进行了强行的归类,只是想告诉大家漏洞挖掘中思路发散的重要性,个人也觉得比较经典。
注: 漏洞案例进行了脱敏以及细节上的修改。
案例-Add [SQLi注入漏洞]1.获得项目子域:https://xxx.com
2.目录扫描发现/user/目录,二层探测发现/register接口,其意为:“注册”
3.根据返回状态信息去Fuzz用户名、密码参数->结果:uname\pwd
4.对uname参数进行SQL注入测试,简单的逻辑判断存在
5.注入点使用16进制的方式无法注入,SQLmap参数--no-escape即可绕过
[拒绝服务]图片验证码图片验证码DoS(拒绝服务攻击)这个思路很早就出来了,当时的第一想法就是采集样本收集参数,使用搜索引擎寻找存在图片验证码的点:
根据这些点写了个脚本进行半自动的参数收集:
在漏洞挖掘的过程中,经常会抓取图片验证码的请求进行Fuzz:
图片验证码地址:https://xxx/validateCode
Fuzz存在潜藏参数,可控验证码生成大小:
[JSONP]无中生有获得一个敏感信息返回的请求端点:http://xxx/getInfo
使用callback_dict.txt字典进行Fuzz:
成功发现callback这个潜藏参数:
[逻辑漏洞]响应变请求这里同样是获得一个敏感信息返回的请求端点:http://xxx/getInfo
返回的信息如下所示:
{"responseData":{"userid":"user_id","login":"user_name","password":"user_password","mobilenum":"user_mobilephone_number","mobileisbound":"01","email":"user_email_address"}}尝试了一些测试思路都无法发现安全漏洞,于是想到了响应变请求思路。
将响应报文的JSON字段内容转化为HTTP请求的字段内容(BurpSuite插件项目:https://github.com/gh0stkey/JSONandHTTPP):
将相关的信息字段内容替换为测试账号B的信息(例如:login=A -> login=B)
发现无法得到预期的越权漏洞,并尝试分析该网站其他请求接口对应的参数,发现都为大写,将之前的参数转换为大写:
继续Fuzz,结果却出人意料达到了预期:
案例-Update [逻辑漏洞]命名规律修改一个登录系统,跟踪JS文件发现了一些登录后的系统接口,找到其中的注册接口成功注册账户进入个人中心,用户管理处抓到如下请求:
POST URL: https://xxx/getRolesByUserId POST Data: userId=1028返回如下信息:
可以看见这里的信息并不敏感,但根据测试发现userId参数可以进行越权遍历
根据url判断这个请求的意思是根据用户id查看用户的身份,url中的驼峰方法(getRolesByUserId)惊醒了我,根据命名规则结构我将其修改成getUserByUserId,也就是根据用户id获取用户,也就成为了如下请求包。
POST URL: https://xxx/getUserByUserId POST Data: userId=1028成功返回了敏感信息,并通过修改userId可以越权获取其他用户的信息。
[逻辑漏洞]敏感的嗅觉在测一个刚上线的APP时获得这样一条请求:
POST /mvc/h5/jd/mJSFHttpGWP HTTP/1.1 …… param={"userPin":"$Uid$","addressType":0}而这个请求返回的信息较为敏感,返回了个人的一些物理地址信息:
在这里param参数是json格式的,其中"userPin":"$Uid$"引起我注意,敏感的直觉告诉我这里可以进行修改,尝试将$Uid$修改为其他用户的用户名、用户ID,成功越权:
[逻辑漏洞]熟能生巧收到一个项目邀请,全篇就一个后台管理系统。针对这个系统做了一些常规的测试之后除了发现一些 没用的弱口令外(无法登录系统的)没有了其他收获。
分析这个后台管理系统的URL:https://xxx/?m=index,该URL访问解析过来 的是主⻚信息。
尝试对请求参数m的值进行Fuzz,7K+的字典进行Fuzz,一段时间之后收获降临:
获得了一个有用的请求:?m=view,该请求可以直接未授权获取信息:
案例-Delete [逻辑漏洞]Token限制绕过在测业务的密码重置功能,发送密码重置请求,邮箱收到一个重置密码的链接:http://xxx/forget/pwd?userid=123&token=xxxx
这时候尝试删除token请求参数,再访问并成功重置了用户的密码:
[SQLi辅助]参数删除报错挖掘到一处注入,发现是root(DBA)权限:
但这时候,找不到网站绝对路径,寻找网站用户交互的请求http://xxx/xxxsearch?name=123,删除name=123,网站报错获取绝对路径:
成功通过SQLi漏洞进行GetWebshell。
总结核心其实还是在于漏洞挖掘时的心细,一件事情理解透彻之后万物皆可Fuzz。
平时注意字典的更新、整理和对实际情况的分析,再进行关联整合。
你用它上網,我用它進你內網! 中華電信數據機遠端代碼執行漏洞
大家好,我是 Orange! 這次的文章,是我在 DEVCORE CONFERENCE 2019 上所分享的議題,講述如何從中華電信的一個設定疏失,到串出可以掌控數十萬、甚至數百萬台的家用數據機漏洞!
身為 DEVCORE 的研究團隊,我們的工作就是研究最新的攻擊趨勢、挖掘最新的弱點、找出可以影響整個世界的漏洞,回報給廠商避免這些漏洞流至地下黑市被黑帽駭客甚至國家級駭客組織利用,讓這個世界變得更加安全!
把「漏洞研究」當成工作,一直以來是許多資訊安全技術狂熱份子的夢想,但大部分的人只看到發表漏洞、或站上研討會時的光鮮亮麗,沒注意到背後所下的苦工,事實上,「漏洞研究」往往是一個非常樸實無華,且枯燥的過程。
漏洞挖掘並不像 Capture the Flag (CTF),一定存在著漏洞以及一個正確的解法等著你去解出,在題目的限定範圍下,只要根據現有的條件、線索去推敲出題者的意圖,十之八九可以找出問題點。 雖然還是有那種清新、優質、難到靠北的比賽例如 HITCON CTF 或是 Plaid CTF,不過 「找出漏洞」 與 「如何利用漏洞」在本質上已經是兩件不同的事情了!
CTF 很適合有一定程度的人精進自己的能力,但缺點也是如果經常在限制住的小框框內,思路及眼界容易被侷限住,真實世界的攻防往往更複雜、維度也更大! 要在一個成熟、已使用多年,且全世界資安人員都在關注的產品上挖掘出新弱點,可想而知絕對不是簡單的事! 一場 CTF 競賽頂多也就 48 小時,但在無法知道目標是否有漏洞的前提下,你能堅持多久?
在我們上一個研究中,發現了三個知名 SSL VPN 廠商中不用認證的遠端代碼執行漏洞,雖然成果豐碩,但也是花了整個研究組半年的時間(加上後續處理甚至可到一年),甚至在前兩個月完全是零產出、找不到漏洞下持續完成的。 所以對於一個好的漏洞研究人員,除了綜合能力、見識多寡以及能否深度挖掘外,還需要具備能夠獨立思考,以及興趣濃厚到耐得住寂寞等等特質,才有辦法在高難度的挑戰中殺出一條血路!
漏洞研究往往不是一間公司賺錢的項目,卻又是無法不投資的部門,有多少公司能夠允許員工半年、甚至一年去做一件不一定有產出的研究? 更何況是將研究成果無條件的回報廠商只是為了讓世界更加安全? 這也就是我們 DEVCORE 不論在滲透測試或是紅隊演練上比別人來的優秀的緣故,除了平日軍火庫的累積外,當遇到漏洞時,也會想盡辦法將這個漏洞的危害最大化,利用駭客思維、透過各種不同組合利用,將一個低風險漏洞利用到極致,這也才符合真實世界駭客對你的攻擊方式!
故事回到今年初的某天,我們 DEVCORE 的情資中心監控到全台灣有大量的網路地址開著 3097 連接埠,而且有趣的是,這些地址並不是什麼伺服器的地址,而是普通的家用電腦。 一般來說,家用電腦透過數據機連接上網際網路,對外絕不會開放任何服務,就算是數據機的 SSH 及 HTTP 管理介面,也只有內部網路才能訪問到,因此我們懷疑這與 ISP 的配置失誤有關! 我們也成功的在這個連接埠上挖掘出一個不用認證的遠端代碼執行漏洞! 打個比喻,就是駭客已經睡在你家客廳沙發的感覺!
透過這個漏洞我們可以完成:
- 竊聽網路流量,竊取網路身分、PTT 密碼,甚至你的信用卡資料
- 更新劫持、水坑式攻擊、內網中繼攻擊去控制你的電腦甚至個人手機
- 結合紅隊演練去繞過各種開發者的白名單政策
- 更多更多…
而相關的 CVE 漏洞編號為:
相較於以往對家用數據機的攻擊,這次的影響是更嚴重的! 以往就算漏洞再嚴重,只要家用數據機對外不開放任何連接埠,攻擊者也無法利用,但這次的漏洞包含中華電信的配置失誤,導致你家的數據機在網路上裸奔,攻擊者僅僅 「只要知道你的 IP 便可不需任何條件,直接進入你家內網」,而且,由於沒有數據機的控制權,所以這個攻擊一般用戶是無法防禦及修補的!
經過全網 IPv4 的掃瞄,全台灣約有 25 萬台的數據機存在此問題,「代表至少 25 萬個家庭受影響」,不過這個結果只在 「掃描當下有連上網路的數據機才被納入統計」,所以實際受害用戶一定大於這個數字!
而透過網路地址的反查,有高達九成的受害用戶是中華電信的動態 IP,而剩下的一成則包含固定制 IP 及其他電信公司,至於為何會有其他電信公司呢? 我們的理解是中華電信作為台灣最大電信商,所持有的資源以及硬體設施也是其他電信商遠遠不及的,因此在一些比較偏僻的地段可能其他電信商到使用者的最後一哩路也還是中華電信的設備! 由於我們不是廠商,無法得知完整受影響的數據機型號列表,但筆者也是受害者 ╮(╯_╰)╭,所以可以確定最多人使用的中華電信光世代 GPON 數據機 也在受影響範圍內!
(圖片擷自網路)
只是一個配置失誤並不能說是什麼大問題,所以接下來我們希望能在這個服務上挖掘出更嚴重的漏洞! 軟體漏洞的挖掘,根據原始碼、執行檔以及 API 文件的有無可依序分為:
- 黑箱測試
- 灰箱測試
- 白箱測試
在什麼都沒有的的狀況下,只能依靠經驗以及對系統的了解去猜測每個指令背後的實作、並找出漏洞。
黑箱測試3097 連接埠提供了許多跟電信網路相關的指令,推測是中華電信給工程師遠端對數據機進行各種網路設定的除錯介面!
其中,可以透過 HELP 指令列出所有功能,其中我們發現了一個指令叫做 MISC ,看名字感覺就是把一堆不知道怎麼分類的指令歸類在這,而其中一個叫做 SCRIPT 吸引了我們! 它的參數為一個檔案名稱,執行後像是會把檔案當成 Shell Script 來執行,但在無法在遠端機器留下一個可控檔案的前提下,也無法透過這個指令取得任意代碼執行。 不過有趣的是,MISC SCRIPT 這個指令會將 STDERR 給顯示出來,因此可以透過這個特性去完成任意檔案讀取!
在漏洞的利用上,無論是記憶體的利用、或是網路的滲透,不外乎都圍繞著對目標的讀(Read)、 寫(Write) 以及代碼執行(eXecute) 三個權限的取得,現在我們取得了第一個讀的權限,接下來呢?
除錯介面貌似跑在高權限使用者下,所以可以直接透過讀取系統密碼檔得到系統使用者管理登入的密碼雜湊!
透過對 root 使用者密碼雜湊的破解,我們成功的登入數據機 SSH 將「黑箱」轉化成「灰箱」! 雖然現在可以成功控制自己的數據機,但一般家用數據機對外是不會開放 SSH 服務的,為了達到可以「遠端」控制別人的數據機,我們還是得想辦法從 3097 這個服務拿到代碼的執行權限。
整個中華電信的數據機是一個跑在 MIPS 處理器架構上的嵌入式 Linux 系統,而 3097 服務則是由一個在 /usr/bin/omcimain 的二進位檔案來處理,整個檔案大小有將近 5MB,對逆向工程來說並不是一個小數目,但與黑箱測試相較之下,至少有了東西可以分析了真棒!
$ uname -a Linux I-040GW.cht.com.tw 2.6.30.9-5VT #1 PREEMPT Wed Jul 31 15:40:34 CST 2019 [luna SDK V1.8.0] rlx GNU/Linux $ netstat -anp | grep 3097 tcp 0 0 127.0.0.1:3097 0.0.0.0:* LISTEN $ ls -lh /usr/bin/omcimain -rwxr-xr-x 1 root root 4.6M Aug 1 13:40 /usr/bin/omcimain $ file /usr/bin/omcimain ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked現在,我們可以透過逆向工程了解每個指令背後的原理及實作了! 不過首先,逆向工程是一個痛苦且煩悶的經過,一個小小的程式可能就包含幾萬、甚至十幾萬行的組合語言代碼,因此這時挖洞的策略就變得很重要! 從功能面來看,感覺會存在命令注入相關的漏洞,因此先以功能實作為出發點開始挖掘!
整個 3097 服務的處理核心其實就是一個多層的 IF-ELSE 選項,每一個小框框對應的一個功能的實作,例如 cli_config_cmdline 就是對應 CONFIG 這條指令,因此我們搭配著 HELP 指令的提示一一往每個功能實作挖掘!
研究了一段時間,並沒有發現到什麼嚴重漏洞 :( 不過我們注意到,當所有指命都匹配失敗時,會進入到了一個 with_fallback 的函數,這個函數的主要目的是把匹配失敗的指令接到 /usr/bin/diag 後繼續執行!
with_fallback 大致邏輯如下,由於當時 Ghidra 尚未出現,所以這份原始碼是從閱讀 MIPS 組合語言慢慢還原回來的! 其中 s1 為輸入的指令,如果指令不在定義好的列表內以及指令中出現問號的話,就與 /usr/bin/diag 拼湊起來丟入 system 執行! 理所當然,為了防止命令注入等相關弱點,在丟入 system 前會先根據 BLACKLISTS 的列表檢查是否存在有害字元。
char *input = util_trim(s1); if (input[0] == '\0' || input[0] == '#') return 0; while (SUB_COMMAND_LIST[i] != 0) { sub_cmd = SUB_COMMAND_LIST[i++]; if (strncmp(input, sub_cmd, strlen(sub_cmd)) == 0) break; } if (SUB_COMMAND_LIST[i] == 0 && strchr(input, '?') == 0) return -10; // ... while (BLACKLISTS[i] != 0) { if (strchr(input, BLACKLISTS[i]) != 0) { util_fdprintf(fd, "invalid char '%c' in command\n", BLACKLISTS[i]); return -1; } i++; } snprintf(file_buf, 64, "/tmp/tmpfile.%d.%06ld", getpid(), random() % 1000000); snprintf(cmd_buf, 1024, "/usr/bin/diag %s > %s 2>/dev/null", input, file_buf); system(cmd_buf);而 BLACKLISTS 定義如下:
char *BLACKLISTS = "|<>(){}`;";如果是你的話,能想到如何繞過嗎?
答案很簡單,命令注入往往就是這麼的簡單且樸實無華!
這裡我們示範了如何從 PTT 知道受害者 IP 地址,到進入它數據機實現真正意義上的「指哪打哪」!
故事到這邊差不多進入尾聲,整篇文章看似輕描淡寫,描述一個漏洞從發現到利用的整個經過,從結果論來說也許只是一個簡單的命令注入,但實際上中間所花的時間、走過的歪路是正在讀文章的你無法想像的,就像是在黑暗中走迷宮,在沒有走出迷宮前永遠不會知道自己正在走的這條路是不是通往目的正確道路!
挖掘出新的漏洞,並不是一件容易的事,尤其是在各式攻擊手法又已趨於成熟的今天,要想出全新的攻擊手法更是難上加難! 在漏洞研究的領域上,台灣尚未擁有足夠的能量,如果平常的挑戰已經滿足不了你,想體驗真實世界的攻防,歡迎加入與我們一起交流蕉流 :D
- 2019 年 07 月 28 日 - 透過 TWCERT/CC 回報中華電信
- 2019 年 08 月 14 日 - 廠商回覆清查並修補設備中
- 2019 年 08 月 27 日 - 廠商回覆九月初修補完畢
- 2019 年 08 月 30 日 - 廠商回覆已完成受影響設備的韌體更新
- 2019 年 09 月 11 日 - 廠商回覆部分用戶需派員更新, 延後公開時間
- 2019 年 09 月 23 日 - 與 TWCERT/CC 確認可公開
- 2019 年 09 月 25 日 - 發表至 DEVCORE CONFERENCE 2019
- 2019 年 11 月 11 日 - 部落格文章釋出
Make Sure You Keep an Eye on Your APIs
Adopt Insertion Point Security for a Microservices World
基于HPP参数污染的Web服务器指纹识别技术
Web Application Server BackendParsing ResultExample ASP.NET / IISAll occurrences concatenated with a commacolor=red,blue ASP / IISAll occurrences concatenated with a commacolor=red,blue PHP / ApacheLast occurrence onlycolor=blue PHP / ZeusLast occurrence onlycolor=blue JSP, Servlet / Apache TomcatFirst occurrence onlycolor=red JSP, Servlet / Oracle Application Server 10gFirst occurrence onlycolor=red JSP, Servlet / JettyFirst occurrence onlycolor=red IBM Lotus DominoLast occurrence onlycolor=blue IBM HTTP ServerFirst occurrence onlycolor=red mod_perl, libapreq2 / ApacheFirst occurrence onlycolor=red Perl CGI / ApacheFirst occurrence onlycolor=red mod_wsgi (Python) / ApacheFirst occurrence onlycolor=red Python / ZopeAll occurrences in List data typecolor=['red','blue']
(来源:https://www.owasp.org/index.php/Testing_for_HTTP_Parameter_pollution_(OTG-INPVAL-004))
0x02对于常见情形的的识别 上表的类型太全面了,我们一般只需要覆盖几个常用的就可以了,因此整理出如下粗略的判断方式
不过这个判断较为粗糙,而且还有种种因素造成的误差导致想要实现一个完美的判断工具的工作量远大于手动判断,在实际操作的时候建议手动判断 0x03手动判断 手动判断则更为灵活,现拿██带学的██研究院官网开刀 发现存在搜索功能,从搜索功能处下手,因为服务器一般会打出搜索字符串,如下图我搜索了nmsl发现结果被打出来了
接着再参数污染一个1234
发现都被服务器接收了,类似于iis的情形,但是按理来说用来分割的逗号没有了(经过测试可知逗号被过滤了) 接着进行最后一项测试,在keyword参数前面加一个&符号
0x04工具实现 本人实现了一个很粗糙的工具,代码过于丑陋不予开源,看个图吧 结果返回正常,排除ASP,识别结果ASP.NET