Netskope Threat Protection recently blocked several GitHub Pages sites that were infected by Ramnit. This post explores how these sites came to be infected by Ramnit and discusses the potential reach an attacker has when they compromise a GitHub repository.
Disclosure
Netskope reported the accounts infected with Ramnit to GitHub on 3 October 2019.
GitHub pages
GitHub Pages are public web pages usually hosted on GitHub’s github.io domain at a URL formatted ‘username.github.io’. GitHub Pages also comes with a powerful static site generator called Jekyll. Jekyll uses templates to convert markdown into static HTML content as shown in Figure 1.
Figure 1: GitHub pages
Ramnit
Ramnit is a file-infector and a worm that copies itself to removable drives and infects .exe, .dll, .htm and .html files. There are also some variants of the malware family that open a back door on the compromised computer. Though the global footprint of the Ramnit botnet was dismantled in 2015, it continues to remain one of the most predominant malware due to its wormed file infector nature.
Technical Analysis
Ramnit infects .exe, .dll, .htm and .html files. If the victim of a Ramnit infection has also cloned their GitHub Pages repository, the HTML template files in the repository will also be infected.
When Jekyll generates the HTML pages from the infected templates, the resulting webpages are also infected. As a result, each of the generated pages on the generated site username.github.io contain multiple traces of the Ramnit infection. An excerpt of the infected code (containing an ActiveX script) is shown in Figure 2.
Figure 2: Ramnit code appended in the infected HTML page
Upon visiting this website in Internet Explorer (ActiveX is only supported in IE), the victim is prompted with a message to enable Microsoft script Runtime ActiveX control as shown in Figure 3.
Figure 3: Microsoft script Runtime ActiveX control
When the script runs, it drops the Ramnit payload in the %temp% folder as svchost.exe thereby continuing its infection kill chain.
Netskope Detection
Netskope’s Next-Gen SWG detects and blocks the Ramnit infected page. Additionally, Netskope Threat protection also detects the upload and download activity of infected Ramnit HTML pages over GitHub as Trojan.Dropper.VBS.Q.
Conclusion
This post details the lateral movement of Ramnit from an infected machine to public GitHub pages. This is an interesting attack vector because:
- Github pages are public and therefore can infect any users on the internet
- Github is typically part of normal business operations and repositories are typically shared among teams, which opens up opportunities for the infection to spread within an organization.
This example of Ramnit-infected HTML pages is limited in scope because it only affects IE, but it serves as an example of how any infector might spread through GitHub pages. The potential for infection could have been greater if it had been more similar to a supply chain attack — if one of the popular Jekyll template repositories had been compromised — or if a more widely used repository was infected. A file infector with a wider scope than just targeting IE with an ActiveX script could have also spread more aggressively. To protect against attacks compromising source code on GitHub, it is very important to have the required security tooling. Netskope’s CASB can help prevent malicious code from being shared and pushed to GitHub.
Indicators of Compromise
URLs
onedayonedot[.]github.io
hashub[.]github.io