Security Research
Black-box assessments against organisations without a bug bounty programme. Reconnaissance first, exploitation only where scope allows, a written report at the end.
Currently active — learning Arch from the ground up, prepping for hackathons
Security research & recon automation
I find vulnerabilities in systems that don't have a bug bounty, then write them up so someone can actually fix them. Reconnaissance first, verification twice, and a report that names a fix instead of a target.
Where the constraint came from, and what it turned into.
Almost everything here started on a five-inch screen. Termux was the first real instrument — a full Linux shell folded into an Android phone, no proper keyboard, no patience for shortcuts.
That constraint turned into a method: build tools that work where the environment refuses to cooperate, then confirm they hold up everywhere else. A phone forces you to know which parts of a system are essential and which are decoration.
The laptop didn't remove the constraints, it changed them. I reach my own machines through Cloudflare Tunnel and Tailscale SSH rather than a direct connection, because my ISP puts me behind CGNAT — there is no public address to open a port on. Chasing that taught me more about routing, reachability, and NAT traversal than any tutorial would have: it is the difference between a connection that times out and one that gets refused, and knowing which one you are looking at.
Now I'm learning Arch from the base up — installation, package management, shell and service configuration — on purpose, without presets. If I don't understand the operating system, I don't really understand the behaviour of the tools running on it.
I'm self-taught, which mostly means I've broken more things than I was ever taught not to. It's a slow way to learn, but every fix comes with a reason attached — and the reason is the part that transfers to the next problem.
Black-box assessments against organisations without a bug bounty programme. Reconnaissance first, exploitation only where scope allows, a written report at the end.
Chaining open-source tooling into pipelines that produce the same result on the second run. The automation is the point; the tools are interchangeable.
Building detection logic teaches you what attackers leave behind. Walking past it teaches you what defenders assume. The notes from each side are what make the other useful.
Agentic coding as a working method, not a shortcut. I route models through OmniRouter — one endpoint in front of many providers — so a stalled or rate-limited model fails over instead of stopping the session. Everything it writes still gets read before it ships.
Load reflects how often a cluster is actually in use — not a self-graded score. Familiarity, not mastery.
Daily driver Regular Project-dependent
// tools change, method doesn't.
Each one states the problem, the method, the evidence, and the outcome. Where evidence can't be shown, the file says so instead of implying otherwise.
OSINT enrichment on a single identifier means the same handful of lookups, repeated by hand, across a dozen browser tabs. The gathering eats the time that should go into interpretation — and when two sources disagree, a manual process tends to quietly keep whichever answer it saw last.
One input, fanned out across several sources concurrently, then normalised into a single shape so results can be compared field by field. Conflicts are surfaced as conflicts rather than resolved silently — each value carries the source it came from. Built on Node.js, which is also how I'm learning the backend side properly.
Held back until the tool stops changing shape.
The conflict view is the artifact worth showing, and its output format is still moving. A
screenshot of it now would document a version that no longer exists. Available on request in
the meantime: a sanitised sample response with two sources disagreeing on one field.
In active development — source integrations and result normalisation are the current work. Described here at methodology level only; nothing on this site performs a lookup, and nothing will.
Termux was never going to host long-running scans or persistent services. Moving to a laptop solved that and introduced a sharper problem: my ISP puts me behind CGNAT, so there is no public address to reach. Plain SSH inbound was never going to work, and port forwarding has nothing to forward.
Arch installed from the base up rather than from an installer image, so every package on the machine is one I chose. For access, the direct route was diagnosed before it was replaced: a timeout rather than a refusal is the tell that nothing is listening on a reachable address. The fix is outbound-only — a Cloudflare Tunnel for HTTP and Tailscale for SSH, both of which dial out rather than wait to be dialled.
Evidence here would map my own attack surface.
The useful artifacts — the network diagram and the terminal capture of the
timeout-versus-refusal diagnosis — describe the exact route into a machine I use for
assessments. The method is in full above; the topology stays off a public page.
The machine is reachable from anywhere without exposing a listening port to the internet — which is a better posture than the port forward I originally wanted. The detour taught me more about NAT traversal than any tutorial had.
The first pass of an assessment is the same every time — subdomain enumeration, HTTP probing, vulnerability scanning — and doing it by hand is both slow and inconsistent between targets. Worse, scanner output reads as findings if you let it. Most of what comes out is noise wearing a severity label.
recon-ng and ReconFTW chained into a single pass that runs the same way on every target, so results are comparable across assessments. Output is treated as leads, not findings: everything is deduplicated, then hand-verified, then graded Confirmed, Probable, or Hypothesis before it can enter a report. Anything that fails reproduction is dropped rather than downgraded.
The numbers are real; publishing them is not safe yet.
A before/after count is only meaningful next to the assessment it came from, and that
assessment identifies a target. A target-free version — pipeline diagram plus the survival
rate across runs — is what belongs here, and it is the next thing I add.
Verified output becomes the raw material for structured disclosure reports — triaged, deduplicated, and rewritten in plain language before anything reaches an organisation.
A finding that can't be reproduced by the person receiving it is not a disclosure, it's a rumour. Organisations without a bug bounty programme have no intake process either, so the report has to do the work the programme would normally do: establish scope, prove the issue, and make the fix obvious.
One format, every time: scope assessed, reproduction steps written so someone else can follow them, affected system identified, and a grade attached that stays honest even when it's less impressive. No speculation about impact I can't demonstrate. Then I wait on the organisation's timeline rather than mine.
Targets are not named here, by design.
What is shareable is the format itself — the blank template, and one fully redacted sample
showing structure and grading without identifying the organisation. Both go out on request
to anyone assessing the work.
Reported to an Indian government body and a private firm — named nowhere on this site, and not in conversation either.
Tools tell you something is wrong; they don't tell you why, and a report that can only cite tool output falls apart the moment an engineer pushes back on it. The gap shows up under questioning, which is exactly the wrong time to find it.
Going back through the base layer deliberately — subnetting, the OSI and TCP/IP models, request/response mechanics — and connecting each vulnerability class I meet in the field to the mechanism underneath it. Manual tests against a target, auth flows, IDOR checks, injection points, get verified against that layer before they're written up.
C-02 is the worked example.
The CGNAT diagnosis in that file traces a symptom to the protocol behaviour underneath it:
a timeout instead of a refusal means nothing is listening on a reachable address. Reasoning
from the base layer, on a case where the reasoning is mine to publish.
The CGNAT problem in C-02 is the argument for this: the fix only became obvious once the networking underneath it made sense. Every finding I send can be explained from first principles, not from a screenshot of a scan.
Agentic coding tools point at one provider. When that provider throttles you, errors, or is simply down, the session stops — usually halfway through a refactor, with the working tree in a state nobody wants to inherit. Swapping providers manually means editing config and restarting, which loses the context that made the session worth having.
An OmniRouter gateway sits between the tools and the providers: one local endpoint, many models behind it, quota-aware failover between them. The coding CLI is pointed at that endpoint instead of at a vendor, so switching models is a routing decision rather than a reconfiguration. Cheap models handle mechanical edits; the expensive ones are reserved for the work that actually needs them.
The rule I hold it to is the same one I use for scanner output: generated is not verified. Anything it writes gets read, run, and diffed before it lands. The speed is in the first draft, not in the decision to ship.
This site is the artifact.
Every page here was built through the routing layer described above, review step included.
A redacted routing config and a capture of a mid-session failover are shareable on request;
keys never appear in either.
In daily use — this site was built through it. What it changed most is scope: a two-day scaffolding job becomes an afternoon, which leaves the time for the reading and testing that the scaffolding used to eat.
No job titles — what was actually done, who it went to, and how a finding gets handled once I have one.
Found and reported vulnerabilities across Indian government infrastructure through coordinated disclosure. Reconnaissance first, verification before write-up, a CERT-In-aligned report at the end. Targets aren't named here and won't be.
The same process applied to private organisations: assess within scope, reproduce cleanly, report in plain language, wait on their timeline rather than mine. A finding that can't be reproduced twice doesn't get sent.
CGNAT quietly breaks anything that expects a reachable public address — SSH into my own machine included. Working through it meant understanding NAT traversal, IPv6 availability, and why a connection times out instead of refusing. That distinction was the whole diagnosis.
Migrated off Android/Termux onto a Linux laptop, learning Arch by building it rather than installing it — packages, configuration, and customisation done deliberately so I know what every piece is doing and why it's there.
Moved my build workflow onto agentic coding, routed through OmniRouter so one endpoint fronts many models and a rate limit becomes a failover rather than a dead session. It changed the economics of scaffolding — but not the review step. Generated code gets the same treatment as scanner output: assume nothing until it has been read and run.
How a finding gets handled between discovering it and sending it.
Verify before you write. I don't report anything I can't reproduce cleanly. Every report includes a clear reproduction, the affected system, and no speculation about impact I can't prove.
I document what I observed, not what I suspect, and I wait on organisational timelines rather than mine. The grade below is attached before the report is sent, and it doesn't get upgraded to make the finding look better.
Reproduced cleanly, twice, on separate attempts.
Strong evidence, not fully proven — labelled as such in the report.
Suspected only. Stays in my notes until it isn't.
Mostly primary sources — man pages, GNU coreutils, the RFCs behind DNS and HTTP, PortSwigger's research write-ups, and the nuclei template repo when I want to see how other people encode a check.
Learning Arch from the base up, building the Node.js OSINT project, tuning recon automation, and preparing for hackathons.
Open to conversations about recon automation, disclosure workflows, OSINT tooling, or debugging Bash at 2am.
Open to conversation
Direct channelMessages go straight to my inbox. Nothing is stored on this site — it has no backend, no analytics, and no third-party scripts.
Security researcher — recon automation, coordinated disclosure, OSINT tooling, Linux from the base up.