看我如何發現Github企業版程式SQL注入漏洞並獲得5000美刀賞金。 GitHub企業版軟體是專供公司團體用來部署在內網進行開發服務的商業性應用程式。 Github企業版採用標準OVF格式集成,以虛擬機器(VM)鏡像方式發佈,可以在enterprise.github.com網站註冊下載45天試用版本,並把其部署在任何虛擬機器環境中。 通過下載其試用版本軟體進行分析,我花了一周時間,發現了其中存在的SQL注入漏洞,並獲得了5000美元漏洞賞金。
Github企業版VM環境安裝之後的效果如下:
現在,Github搭建完成,接下來就可以在虛擬機器系統內進行深入分析。
環境安全性分析
用Nmap發現有6個開啟埠:
$ nmap -sT -vv -p 1-65535 192.168.187.145 ... PORT STATE SERVICE 22/tcp open ssh 25/tcp closed smtp 80/tcp open HTTP 122/tcp open smakynet 443/tcp open HTTPs 8080/tcp c losed HTTP-proxy 8443/tcp open HTTPs-alt 9418/tcp open git
這些埠用途初步分析為:
埠22/tcp和9418/tcp可能用於進程haproxy轉發後端服務babeld;
埠80/tcp和443/tcp用於Github主要服務;
埠122/tcp用於SSH服務;
埠8443/tcp用於GitHub的管理主控台服務。
由於GitHub的管理主控台需要密碼才能實現登錄,所以你可以設置密碼並通過122埠的SSH服務連接VM環境,SSH連接進入系統之後,檢查系統資訊發現,幾乎所有的Github服務代碼都位於目錄/data/下:
# ls -al /data/ total 92 drwxr-xr-x 23 root root 4096 Nov 29 12:54 . drwxr-xr-x 27 root root 4096 Dec 28 19:18 .. drwxr-xr-x 4 git git 4096 Nov 29 12:54 alambic drwxr-xr-x 4 babeld babeld 4096 Nov 29 12:53 babeld drwxr-xr-x 4 git git 40 96 Nov 29 12:54 codeload drwxr-xr-x 2 root root 4096 Nov 29 12:54 db drwxr-xr-x 2 root root 4096 Nov 29 12:52 enterprise d rwxr-xr-x 4 enterprise-manage enterprise-manage 4096 Nov 29 12:53 enterprise-manage drwxr-xr-x 4 git git 4096 Nov 29 12:54 failbotd drwxr-xr-x 3 root root 4096 Nov 29 12:54 git-hooks drwxr-xr-x 4 git git 4096 Nov 29 12:53 github drwxr-xr-x 4 gi t git 4096 Nov 29 12:54 git-import drwxr-xr-x 4 git git 4096 Nov 29 12:54 gitmon drwxr-xr-x 4 git git 4096 Nov 29 12:54 gp gverify drwxr-xr-x 4 git git 4096 Nov 29 12:54 hookshot drwxr-xr-x 4 root root 4096 Nov 29 12:54 lariat drwxr-xr-x 4 root root 4096 Nov 29 12:54 longpoll drwxr-xr-x 4 git git 4096 Nov 29 12:54 mail-replies drwxr-xr-x 4 git git 4096 Nov 29 12:54 pages drwxr-xr-x 4 root root 4096 Nov 29 12:54 pages-lua drwxr-xr-x 4 git git 4096 Nov 29 12:54 render lrwxrwxrwx 1 root root 23 Nov 29 12:52 repositori es -> /data/user/repositories drwxr-xr-x 4 git git 4096 Nov 29 12:54 slumlord drwxr-xr-x 20 root root 4096 Dec 28 19:22 user
查看其中的檔源碼,貌似是base64加密的:
GitHub使用了一個自訂的庫來加密混淆自身原始程式碼。 如果你在谷歌搜索ruby_concealer.so,你會發現一個牛人已經對這種加密方式作了分析,只需在ruby_concealer.so中用rb_f_puts替換rb_f_eval即可實現解密。 但我們還是實際動手來看看,打開IDA Pro分析一下:
你可以發現,其來源程式使用了類Zlib::Inflate::inflate進行資料解壓縮,並使用了一段明文KEY作為異或(XOR)操作,然而,讓人搞笑的是,這段明文KEY竟然是這樣的:
This obfuscation is intended to discourage GitHub Enterprise customers from making modifications to the VM. We know this 'encryption' is easily broken. (我們清楚該加密很容易被破解,但其目的在於防止GitHub企業版使用者隨意對VM環境進行修改)
哎呀,讓人哭笑不得....
有了這些,我們就可以自己構造解密腳本了:
require 'zlib' key = "This obfuscation is intended to discourage GitHub Enterprise customers from making modifications to the VM. We know this 'encryption' is easily broken. " def decrypt(s) i, plaiNtext = 0, '' Zlib::Inflate.inflate(s).each_byte do |c| plaiNtext length].ord).chr i += 1 end plaiNtext end content = File.open(ARGV[0], "r").read content.sub! %Q(require "ruby_concealer.so"\n__ruby_concealer__), " decrypt " plaiNtext = eval content puts plaiNtext
代碼分析
實現程式原始程式碼解密之後,讓我們嘗試著進行代碼審計:
$ cloc /data/ 81267 text files. 47503 unique files. 24550 files ignored. HTTP://cloc.sourceforge.net v 1.60 T=348.06 s (103.5 files/s, 15548.9 lines/s) ---------------------------------------- ------------------------------------------- Language files blank comment code -------------------------------------- --------------------------------------------- Ruby 25854 359545 437125 1838503 JAVAscript 4351 109994 105296 881416 YAML 6 00 1349 3214 289039 Python 1108 44862 64025 180400 XML 121 6492 3223 125556 C 444 30903 23966 123938 Bourne Shell 852 1449 0 16417 87477 HTML 636 24760 2001 82526 C++ 184 8370 8890 79139 C/C++ Header 428 11679 22773 72226 JAVA 198 6665 14303 451 87 CSS 458 4641 3092 44813 Bourne Again Shell 142 6196 9006 35106 m4 21 3259 369 29433 ... $ ./bin/rake about About your a pplication's environment Ruby version 2.1.7 (x86_64-linux) RubyGems version 2.2.5 {C}Rack version 1.6.4 Rails version 3.2. 22.4 JavaScript Runtime Node.js (V8) Active Record version 3.2.22.4 Action Pack version 3.2.22.4 Action Mailer version 3.2.22.4 Active Support version 3.2.22.4 Middleware GitHub::DefaultRoleMiddleware, R ack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions , ActionDispatch::DebugExceptions, ActionDispatch::Callbacks, ActiveRecord::ConnectionAdapters:: ConnectionManagement, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, ActionDispatch::Head, Rack::ConditionalGet, Rack::ETag, ActionDispatch:: BestStandardsSupport Application root /data/github/9fcdcc8 Environment production Database adapter githubmysql2 Database schema version 20161003225024
從以上分析可以看出大部分為Ruby代碼,而且可以發現: