# Carbon14
OSINT tool for estimating when a web page was written.
From [Wikipedia][1]:
> Radiocarbon dating (also referred to as carbon dating or carbon-14 dating) is
> a method for determining the age of an object containing organic material by
> using the properties of radiocarbon (14C), a radioactive isotope of
> carbon.
## Rationale
While performing digital forensics or OSINT, it might be crucial to determine
when a certain blog post has been written. Common CMS's easily permit to change
the displayed date of content, affecting both websites and RSS feeds. Moreover,
the dynamic nature of most web pages does not allow investigators to use the
`Last-Modified` HTTP header.
However, most users do not alter the timestamps of static resources that are
uploaded while writing articles. The `Last-Modified` header of linked images can
be leveraged to estimate the time period spent by the writer while preparing a
blog post. This period can be compared to what the CMS shows in order to detect
notable differences.
## Installation
You can install Carbon14 using Pip:
pip install carbon14
Or as a tool with `uv`:
uv tool install carbon14
## Usage
Carbon14 accepts the target URL and an optional author name.
usage: carbon14 [-h] [-a name] url
Date images on a web page.
positional arguments:
url URL of the page
optional arguments:
-h, --help show this help message and exit
-a name, --author name
author to be included in the report
The tool prints a simple report in [Pandoc's extended Markdown][2] format which
can then be redirected to a file (or with `tee`). For example:
carbon14.py 'https://eforensicsmag.com/extracting-data-damaged-ntfs-drives-andrea-lazzarotto/' > report.md
Here's a snippet of the output:
# Internal images
--------------------------------------------------------------------------------
Date (UTC) Date (Europe/Rome) URL
-------------------- -------------------- --------------------------------------
[...]
2017-03-06 14:27:17 2017-03-06 15:27:17
2017-03-06 14:43:04 2017-03-06 15:43:04
2017-03-06 14:48:22 2017-03-06 15:48:22
We can infer that work on that article began on March 6, 2017.
## Using proxies
Carbon14 uses the Python `requests` library, which supports standard proxy
environment variables. This means you can route traffic through a proxy
without adding command-line options.
Temporary proxy usage for a single command:
HTTP_PROXY=http://127.0.0.1:8080 HTTPS_PROXY=http://127.0.0.1:8080 carbon14 https://example.org
Persist proxy settings in your shell session:
export HTTP_PROXY=http://127.0.0.1:8080
export HTTPS_PROXY=http://127.0.0.1:8080
carbon14 https://example.org
If you use Tor, point those variables to your local HTTP proxy bridge. A common
setup is Tor + Privoxy, where Privoxy listens on `127.0.0.1:8118` and forwards
traffic to Tor:
export HTTP_PROXY=http://127.0.0.1:8118
export HTTPS_PROXY=http://127.0.0.1:8118
carbon14 https://example.onion
You may also unset variables to go back to direct connections:
unset HTTP_PROXY HTTPS_PROXY
## Markdown report
The Markdown syntax is text-based and lightweight. This means that the report
**can be used or printed as-is,** like a normal text file. Optionally, examiners
might want to convert it to a different format such as HTML, ODT or DOCX.
This *optional step* can be performed with [Pandoc][3]:
pandoc -s report.md -o report-web.html
pandoc report.md -o report-libreoffice.odt
pandoc report.md -o report-msword.docx
Pandoc can also be used to generate HTML reports with custom CSS files, PDF
reports and several other outputs. Please refer to its [documentation][2] for
further details.
[1]: https://en.wikipedia.org/wiki/Radiocarbon_dating
[2]: https://pandoc.org/MANUAL.html
[3]: https://pandoc.org/