Caught a .git/config crawler

My infinite web site generator caught a .git/config crawler.

Last November, I updated my program bork.php to do a better job of creating .git/config files. I noticed in my Apache log files that some apparent bad actors were requesting URLs with a path of .git/config. That particular file name contains the per repository configuration information for the git version control system. Due to its superiority, git has become the single most popular version control system ever.

Just for reference, here’s what request body asking my web server for a .git/config URL gives back:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yorgi-gromolski/spintronic-tractor-parts.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
    remote = origin
    merge = refs/heads/main
[branch "fuck-you-moron"]
    url = git@github.com:richard-nixon/fartpipe.git
    remote = origin
    merge = refs/heads/fuck-you-moron
[branch "nRqEtp3gAecLhY"]
    url = git@github.com:bZPVQxEKkSVAqw0mrnI/TbdQETY1MxUb1ETu8j.git
    remote = origin
    merge = refs/heads/sNvilUBPj8xooSTH

The last branch has a randomly-selected name, and a randomly-selected URL. They’re different every time someone asks for /.git/config I actually have no idea if this is a valid format for a .git/config file.

Some time in mid-2025, people started actively collecting .git/config files. I am not all that knowledgeable about git, but it looks to me like the contents of .git/config aren’t intrinsically valuable. People apparently keep credentials of various sorts, user names and passwords, TLS certificates, etc, in repositories that are under git version control. I found a bad actor that requested /.git/config, then spidered an entirely fictional git repository.

Discovery

Between March and September of 2025, I had my web server send Meta (a.k.a. Facebook) web crawlers into an infinite swamp of garbage. I was curious about the effect on Meta’s crawlers, and also leery of the effect on my $4.37 a month VPS, so I kept Apache “combined” format log files. I still keep them, because then I can look through them for other odd behavior.

From the Apache log files, I made myself a chart showing the number of HTTP requests a day my VPS receives.

HTTP requests per day chart, showing an amazing spike in June 2026

The dates in the above chart are UTC.

Notice the tall, narrow spike in June 2026. That’s two days, June 19 and 20, where 563057 and 339286 requests arrived respectively. For some sense of magnitude, the other days in June 2026 range between 96,000 and 120,000 requests per day. Meta ramped up to a maximum of 270,000 requests a day.

After a little futzing around, I discovered that a single IPv4 address, 195.178.110.18, had made 434039 of the requests on 2026-06-19, and 220239 of the requests on 2026-06-20.

Date Request count
2025-12-24 4
2025-12-25 5
2025-12-28 8
2026-01-01 8
2026-01-11 4
2026-01-12 4
2026-01-14 4
2026-02-26 1
2026-03-04 1
2026-03-07 1
2026-03-15 1334
2026-03-16 380
2026-03-24 1
2026-03-26 1
2026-03-28 1
2026-03-30 1
2026-04-06 21
2026-04-07 355
2026-04-10 2
2026-04-13 2
2026-04-17 2
2026-04-23 1
2026-04-30 2
2026-05-01 1
2026-05-16 2
2026-05-24 110
2026-06-17 110
2026-06-19 434039 ←
2026-06-20 220239 ←
2026-06-22 225
2026-06-24 115
2026-06-25 108
2026-06-30 225

I piously hope that garbage responses to 650K requests help 195.178.110.18 through its cybercrime journey.

I ran whois against 195.178.110.18 soon after seeing the request count. 195.178.110.18 is part of 195.178.110.0/24. Looking through my Apache log files, I found 59 IP addresses in 195.178.110.0/24 that made 699,774 requests.

IP Address Request count
195.178.110.2 10
195.178.110.15 420
195.178.110.18 657317
195.178.110.21 2
195.178.110.25 39
195.178.110.28 11
195.178.110.31 19
195.178.110.33 1474
195.178.110.34 748
195.178.110.38 5
195.178.110.39 2
195.178.110.48 557
195.178.110.54 19
195.178.110.57 1
195.178.110.64 9
195.178.110.65 1490
195.178.110.68 258
195.178.110.75 56
195.178.110.100 12
195.178.110.101 172
195.178.110.102 1598
195.178.110.103 1102
195.178.110.104 2
195.178.110.108 3298
195.178.110.109 4027
195.178.110.125 1
195.178.110.130 12
195.178.110.131 2
195.178.110.132 6094
195.178.110.133 672
195.178.110.135 2108
195.178.110.144 1
195.178.110.146 10
195.178.110.152 87
195.178.110.155 17
195.178.110.157 2289
195.178.110.159 3272
195.178.110.160 439
195.178.110.161 633
195.178.110.162 71
195.178.110.163 976
195.178.110.164 429
195.178.110.186 12
195.178.110.187 10
195.178.110.190 70
195.178.110.191 16
195.178.110.195 4
195.178.110.199 8424
195.178.110.201 200
195.178.110.204 11
195.178.110.218 26
195.178.110.222 4
195.178.110.223 410
195.178.110.224 7
195.178.110.228 12
195.178.110.240 431
195.178.110.241 42
195.178.110.242 261
195.178.110.246 73

The 195.178.110.0/24 requests date to 2025-03-13, in the earliest log file I kept. Most of the URLs requested by 195.178.110.0/24 look like they’re going fishing: many variations on /$SOMETHING/.git/config, /wp-config.php.save, /.env, /wp-config.php and other

After reading through the logs, I divide up the requests into 4 categories:

  1. General scanning for vulnerabilities, with emphasis on, but not limited to .git, .env, other config files. Requests in this category arrive throughout the period I have log files for. Requests use 1 or 2 user agents every day.
  2. Scanning for low-hanging PHP vulnerabilities - phpinfo.php, wp-config.php, etc 2026-03-28, -29, 2026-06-26, -27
    • only 4 user agents used each day
  3. Spidering .git/config contents 2026-06-19, -20
  4. Reading front page of blog, reading HTML contents of posts and tags, trying to parse out referenced URLs, requesting some of them.
    • 2026-03-15, -16 large number of user agents relative to other scanning

Category 3 contains the requests which drew my attention in the first place.

Category 1: emphasis on .git/config, .env, other config files

The entire period that I have Apache log files for, addresses in 195.178.110.0/24 have made requests for /.git/config, /wp-config.php, /docker-compose.prod.yml and lots of other obvious config files. Because my web site’s HTML does not link to any of these config files, or even provide them, the URLs 195.178.110.0/24 requests indicate that it’s asking for likely URLs, not URLs known to exist.

195.178.110.0/24 even guesses about older config files, like /.env.save, and /.env.backup.

In a lot of instances, the scanner made two GET requests for /.git/config in the same wallclock second, apparently via HTTP. My webserver returned a 301 status code, redirecting to an https: schema URL, which 195.178.110.x promptly asked for. The 195.178.110.0/24 probing system does HTTP first, then falls back on HTTPS.

My experience with feral, grey area software written in PHP is that doing two redundant calls is a common practice. I’ve wondered how cybercriminals distinguish which of the redundant calls’ returns to use. Given that my web server is configured to return different, randomly-chosen contents for /.git/config HTTP requests, I’m amazed that 195.178.110.0/24 came back after probing for various config files and getting multiple different results.

Category 2: PHP low hanging vulnerabilities

During 2026-04-06 and -07, 195.178.110.18 requested some debug or development PHP programs, URLs with paths like /server_info.php, /info.php, /phpinfo.php and /php_info.php. It’s common to have a PHP file with such a name that invokes the PHP system function phpinfo(). That system function generates nice HTML about the PHP interpreter that runs the phpinfo.php program, its configuration, installed modules, and other information that could give clues about PHP vulnerabilities. It’s so common to have this kind of program, and for web spiders to ask for it, that I have a phpinfo.php program that generates HTML similar to what the phpfinfo() function outputs, but accurate only by chance. Some of the requests have “referer” URLs, containing a mix of “http://bruceediger.com”, “http://crudhammer.com” and “http://stratigery.com”, 3 FQDNs that all resolve to a single IP address, that of my $5 a month VPS. These are the only requests with referers. This might be a separate spider operating out of 195.178.110.18, specializing in PHP and likely vulnerabilities.

These requests spanned 2026-04-06T23 to 2026-04-07T01, 377 requests in 1 hour and 52 minutes, about 0.06 requests per second.

At 2026-06-19T03:16:46Z, 195.178.110.18 did a GET method on /.git/HEAD. It rapidly moved along from there.

During this phase, 195.178.110.18 used no referrers, and only one user agent string:

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36

After this, I’m not certain of what to make of 195.178.110.18’s choice of URLs. The randomly-chosen branch names do show up as part of HTTP requests for URLs like /.git/refs/heads/M4_bNpd2507HvUJ, or /.git/refs/remotes/origin/XHgfqRg6Z I’m not an expert on git internals, so these things escape me.

The .git/config file parsing in this phase wasn’t very good, either. 195.178.110.18 ended up requesting “doubled paths” of some files, as in /.git/config/.git/config and /.git/config/.git/logs/refs/heads/A03DSnrylm1LPT The alternative to “not very good parsing” is that the parser got confused by my maybe-illegitimate, randomly-generated .git/config files.

The scanner for this particular phase make just over 210K requests per hour. 2026-06-19 all requests made in the 8pm and 9pm UTC hours. 2026-06-20, all requests made in the 3am hour. That’s about 56 requests per second, which is rather a lot.

Category 4: Front page spidering

2026-03-15, 2026-06-22, -26, -27, it asks for /, posts that were on my web site’s front page, some “tags” URLs that group posts by topic, and some odd, apparently garbage URLs whose paths appear to be mis-parsed HTML elements, and erroneously parsed hyperlink URLs.

The 195.178.110.0/24 system clearly asks for URLs that might exist. The first URLs I have a log of are requests for /.git/config. Just as clearly, it tries to parse HTML that it gets in responses. It doesn’t do a great job of parsing HTML, because it asks for URLs with paths like //en.wikipedia.org/wiki/Voltage_doubler. It mistakenly trims off the https: part of the href attributes of a hyperlink HTML tags, then asks for that as a URL path. It asks for lots of URLs where the path begins with // and is part of a hyperlink in my website’s HTML. It also asks for /body, /dev, /h2, /form and many other pieces of HTML “end tags”. I bet it uses regular expressions to parse HTML.

Some of the requests have referrers, all with an http: schema. The 195.178.110.0/24 system made HTTP requests, then fell back on HTTPS.

2026-05-09, the 195.178.110.0/24 system made 8 requests which had a path of //cdn.usefathom.com/script.js. This is a reference to the script that that Fathom Analytics has you link to in your HTML. I removed all the references to script.js Mon Jul 28 22:14:48 2025 -0600. The 195.178.110.0/24 system retained information from a request made at least 9 months previously.

What about 195.178.110.0/24?

iplocation.net says that 195.178.110.18 is in Andorra. Join the Internet, and encounter new people, I guess.

According to whois on 2026-07-01, the address 195.178.110.18 is part of 195.178.110.0/24, registered to Techoff SRV Limited, in London, England. None of the 195.178.110.0/24 addresses have DNS records.

Looks like Techoff presents itself publicly as dmzhost.co. The whois record for 195.178.110.18 lists an abuse address of dmzhostabuse@gmail.com, which also appears on the dmzhost.co contacts page.

Techoff SRV Limited is Company number 16090235, according to the quaint UK Company House. A British company operating servers in Andorra seems complicated, like the political and legal arrangements of the Channel Islands. There are certainly allegations of abuse from 195.178.110.0/24 IP addresses.

The dmzhost.co web site offers “offshore KVM private servers”, but I can’t scrounge up a physical location. The “DMZHOST Offshore Webhosting” page claims “EU/RU” physical locations. All prices are given in Euros, not Pounds. The cheapest KVM VPS is €5/mo. July 2026, €5 is $5.70, which isn’t extreme.

Summary

I discovered that 195.178.110.18 had made 650,000 HTTP requests on my $5 a month VPS web server. Virtually all of these were for /.git/config, URLs that might have been composed from the randomly-chosen contents of /.git/config, and apparently mis-parsing of the config file.

195.178.110.18 is in CIDR 195.178.110.0/24, owned by a UK company, but assigned to machines in a data center in Andorra. All the IP addresses in 195.178.110.0/24 have been reported multiple times for all kinds of abusive behaviors.

Machines using addresses in 195.178.110.0/24 have made low-intensity scans of my web server, concentrating on URLs that are configuration files or credentials of various sorts, often mistakenly left behind after web site development, or just overlooked.

Occasionally, those machines spider the front page of my web site. They apparently parse the HTML they obtain using some method that when looking for hyperlinks, often gives them incorrect URLs. The data from this spidering is retained for months at least.

Rarely, these machines look for PHP files that when requested can reveal PHP interpreter configuration, or WordPress configuration and credentials.

One time 195.178.110.18, a machine in 195.178.110.0/24, asked form 650,000 URLs all clearly gathered by initially requesting /.git/config, which my web site generator program replies to with a plausible, yet randomly-chosen incorrect config file contents.