# 藍隊工具小抄
###### tags: `藍隊` `資安`
## Suricata
https://docs.suricata.io/en/latest/rules/index.html
rule format
```!
<action> <protocol> <src ip> <src port> <direction> <dst ip> <dst port> (<rule option>; <rule option>)
```
### actions
- alert : 發出告警訊息
- pass : 接受封包
- drop : 丟棄封包,不會發出訊息給來源端,同時發出告警訊息
- reject : 拒絕封包,會發送 RST / ICMP 錯誤訊息給來源端,此外也會發出告警訊息
- rejectsrc : 與 reject 相同
- rejectdst : 與 reject 相同,但是是發送給⽬的端
- rejectboth : 與 reject 相同,但是是發送給來源端和⽬的端
### header
- ip: CIDR, `!` inverse, `[]` grouping, `any`, `$HOME_NET`
- port: `:` range, `!` inverse, `[]` grouping, `any`
- direction: `->`, `<>`
### example
- `alert tls any any -> any any (msg: "[TLS test] client hello"; ssl_state: client_hello; sid: 1;)`
- `alert tcp any any -> $HOME_NET any (msg: "[SYN Scan test]"; tcp.flags: S; threshold: type both, track by_dst, count 1000, seconds 3; sid: 1;)`
## Yara
https://yara.readthedocs.io/en/stable/writingrules.html
rule format
```json
rule <rule name>
{
meta:
<metadata> = <metadata>
strings:
$<string name> = "<string>"
$<string name> = { <hex string> }
condition:
$<string name> <op> $<string name>
}
```
### metadata
optional
### condition
- `and`, `or`
- `#<string name>` counting
- `at` offset, `in (<start>..<end>)` range
- `filesize` file size keyword
- `entrypoint` entrypoint keyword
- `uint32(<addr>)` address pointer
- `<number> of ($<string name>, $<string name>)`
- `for expression of string_set : ( boolean_expression )`
### example
```json
rule silent_banker
{
meta:
description = "This is just an example"
threat_level = 3
in_the_wild = true
strings:
$a = {6A 40 68 00 30 00 00 6A 14 8D 91}
$b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
$c = "UVODFRYSIHLNWPEJXQZAKCBGMT"
condition:
$a or $b or $c
}
```
## mitmproxy script
https://docs.mitmproxy.org/stable/api/events.html
example: https://github.com/mitmproxy/mitmproxy/blob/main/examples/addons/http-trailers.py
```python
from mitmproxy import http
from mitmproxy.http import Headers
def request(flow: http.HTTPFlow):
if flow.request.trailers:
print("HTTP Trailers detected! Request contains:", flow.request.trailers)
if flow.request.path == "/inject_trailers":
if flow.request.is_http10:
# HTTP/1.0 doesn't support trailers
return
elif flow.request.is_http11:
if not flow.request.content:
# Avoid sending a body on GET requests or a 0 byte chunked body with trailers.
# Otherwise some servers return 400 Bad Request.
return
# HTTP 1.1 requires transfer-encoding: chunked to send trailers
flow.request.headers["transfer-encoding"] = "chunked"
# HTTP 2+ supports trailers on all requests/responses
flow.request.headers["trailer"] = "x-my-injected-trailer-header"
flow.request.trailers = Headers([(b"x-my-injected-trailer-header", b"foobar")])
print("Injected a new request trailer...", flow.request.headers["trailer"])
def response(flow: http.HTTPFlow):
assert flow.response
if flow.response.trailers:
print("HTTP Trailers detected! Response contains:", flow.response.trailers)
if flow.request.path == "/inject_trailers":
if flow.request.is_http10:
return
elif flow.request.is_http11:
if not flow.response.content:
return
flow.response.headers["transfer-encoding"] = "chunked"
flow.response.headers["trailer"] = "x-my-injected-trailer-header"
flow.response.trailers = Headers([(b"x-my-injected-trailer-header", b"foobar")])
print("Injected a new response trailer...", flow.response.headers["trailer"])
```