2025/06/30

之前有提到 ZAP 使用shell scan 網站的方法 
今天找到單純使用docker的做法

最常用的方法如下 stable full-scan

docker run --cpus="18" --memory 30000MB --rm -v /tmp:/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-full-scan.py -t https://192.168.24.206 -r 192.168.24.206.html


以下是使用 docker stable     baseline scan
 
docker run --cpus="18" --memory 30000MB --rm -v /tmp:/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py -t https://192.168.24.206 -r 192.168.24.206.html


以下是使用 docker nightly update     baseline scan

docker run --cpus="18" --memory 30000MB --rm -v /tmp:/zap/wrk/:rw -t zaproxy/zap-nightly zap-baseline.py -t http://10.1.1.1 -r 10.1.1.1.html


實際跑起來快 而且方便許多

一樣用shell 來跑 

一行一個網站       

https://aa.bb.com
https://dd.ee.com

寫到  /tmp/site_to_test


#!/bin/bash

while read line
do

    echo "$line"

    docker run --cpus="18" --memory 30000MB --rm -v /tmp:/zap/wrk/:rw -t zaproxy/zap-nightly zap-baseline.py -t http://10.1.1.1 -r 10.1.1.1.html

#    docker run --cpus="18" --memory 30000MB --rm -v /tmp:/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-full-scan.py -t $line -r `echo $line|cut -d '/' -f 3`.html

done < /tmp/site_to_test 

如果沒使用 --rm 全部執行完成後會殘留很多 docker process
列出所有 docker process

docker ps -a

找到如下 process

CONTAINER ID   IMAGE                             COMMAND                   CREATED              STATUS                      PORTS                                       NAMES
0ec0935c4233   ghcr.io/zaproxy/zaproxy:nightly   "zap-full-scan.py -t…"   About a minute ago   Exited (2) 44 seconds ago

清除CONTAINER ID

docker rm 0ec0935c4233

列出所有docker image

docker images

REPOSITORY                TAG       IMAGE ID       CREATED        SIZE
ghcr.io/zaproxy/zaproxy   nightly   432cd81f7738   22 hours ago   2.11GB

清除 IMAGE ID image

docker rmi  432cd81f7738


2025/06/26

本次的ZAP掃出以下的中風險







去年已經出現 本來想說去年應該已經解決了
但今年還是看到 可能是解決不完整

先在 apache 的 CSP 設定內加入以下二行

frame-ancestors 'self';
form-action 'self';

再來處理 style-src
先把 'unsafe-inline' 拿掉
接下來處理的方式有二種

如果在html檔裡直接定義 css 

要使用 hash 或 nonce
使用 nonce 是比較方便的做法

首先在 apache config 裡

style-src 這個定義加上 'nonce-12345678'

12345678 建議置換為亂碼

之後在 css 定義裡加上 nonce 定義
nonce的字串必須跟apahce config裡的相同

<style nonce="123456789" type="text/css">
</style>

修改 html內文 把原本直接定義的style改成先定義css再引用 

例如原本是

<a href="123456.exe" style="color:red;">123456</a>

要改成

<a href="123456.exe" class="red-text">123456</a><br>

同時在上方的css定義加入 red-text

<style nonce="sjdfhs6849" type="text/css">

.red-text {
  color: red;
  font-size: 21px;
}

</style>


另外不使用 hash 跟 nonce 的方法是 把css以獨立檔案定義後再引用

建立 style.css

檔案內容如下

.red-text {
  color: red;
  font-size: 21px;
}

接下來在 html 的head中引用

<head>
<link rel="stylesheet" href="style.css">
</head>

html內文的修正方法如上

2025/06/22

今天把oracle linux 8 升到 almalinux 9

首先升到 almalinux 8

dnf update -y

curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh

bash almalinux-deploy.sh


再升到 almalinux 9

dnf -y update

yum install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm

dnf install -y leapp-upgrade leapp-data-almalinux

leapp preupgrade

查看 log 解決升級會碰到的問題

cpu要改成 x86-64-v2 或以上

leapp upgrade


升完後

dnf -y update 出現以下訊息

warning: Signature not supported. Hash algorithm SHA1 not available.

需要清除有問題的 gpg-pubkey

列出所有 gpg key

rpm -qa gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n'

刪除以下二個  gpg key

gpg-pubkey-ad986da3-5cabf60d    gpg(Oracle OSS group (Open Source Software group) <build@oss.oracle.com>)

gpg-pubkey-ced7258b-6525146f    gpg(AlmaLinux OS 8 <packager@almalinux.org>)

rpm -e gpg-pubkey-ad986da3-5cabf60d
rpm -e gpg-pubkey-ced7258b-6525146f


目前正常
再觀察看看


2025/06/19

為了解決近期弱掃出現的portmapper 中風險
決定把 rpcbind 關了
之後nfs全部走4版

systemctl disable rpcbind.socket
systemctl disable rpcbind.service

mount -t nfs4


2025/06/05

fwupd

超方便的firmware 更新工具

先安裝

apt install fwupd

dnf install fwupd

使用 fwupd 的方法非常簡單,基於執行命令和 正確的方法是始終更新資料庫 在繼續更新設備韌體之前,請先了解可用韌體的資訊。我們可以透過輸入以下內容來做到這一點:

sudo fwupdmgr refresh

至 查看哪些裝置支援 fwupd以及其當前狀態,如果有可用更新,則可以使用以下命令進行更新:

fwupdmgr get-devices

一旦您列出了設備,他們就可以 檢查韌體更新 可以透過運行:

fwupdmgr get-updates

如果有可用的韌體更新, 你可以透過運行來應用它們:

sudo fwupdmgr update

至 顯示已安裝的韌體更新列表 透過 fwupd,您可以使用以下命令來完成此操作:

fwupdmgr history


2025/06/03

由於之前試的guacamole會一直當几斷線
今天找看看 meshcentral能不能錄影
有提供
不過要修改 config.json
路徑在 meshcentral-data/config/json

範例如下

{
  "$schema": "https://raw.githubusercontent.com/Ylianst/MeshCentral/master/meshcentral-config-schema.json",
  "settings": {
    "cert": "10.0.0.1",
    "WANonly": true,
    "_LANonly": true,
    "sessionKey": "MyReallySecretPassword1",
    "port": 443,
    "aliasPort": 443,
    "redirPort": 80,
    "redirAliasPort": 80
  },
  "domains": {
    "": {
      "title": "MyServer",
      "title2": "Servername",
      "minify": true,
      "newAccounts": true,
      "userNameIsEmail": true,
      "SessionRecording": {
        "_onlySelectedUsers": true,
        "_onlySelectedUserGroups": true,
        "onlySelectedDeviceGroups": true,
        "filepath": "/tmp/",
        "index": true,
        "protocols": [1, 2 ],
        "_maxRecordings": 100,
        "maxRecordingDays": 180,
        "maxRecordingSizeMegabytes": 1024
      }
    }
  },
  "_letsencrypt": {
    "email": "myemail@mydomain.com",
    "names": "myserver.mydomain.com",
    "skipChallengeVerification": true,
    "production": false
  }
}

這裡的config設好後 
就不用像之前啟動要再加上 --cert 10.0.0.1 了

node node_modules/meshcentral



2025/06/01

almalinux 10 几天前release

今天在proxmox (PVE) 上安裝時 用iso開几就出現 kernel panic



 








解決的方法就是cpu不要使用預設的 x86-64-v2-AES

也不要用  x86-64-v2

使用  x86-64-v3  或 x86-64-v4 就沒問題了

不過要注意的是 比較舊的host 可能無法支援這二個type 而無法 migrate










官方網站有提到
With RHEL 10, Red Hat will only support x86-64-v3 and higher

不過也有提到
AlmaLinux OS 10 has followed Red Hat’s decision to ship x86-64-v3 optimized binaries by default, but we will also provide an additional x86-64-v2 architecture, allowing users on that older hardware to continue to receive security updates for another 10 years.

所以如果一定要使用 x86-64-v2

就要下載另一個iso



2025/05/28

本來一直都是用ping 在 monitor AP的狀況的
這几天不知為什麼一直出現ping不到的情況
改用fping還是一樣
目前改用nping 來測 5246 port
看來正常了

/usr/bin/nping -c 1 --tcp -p 5246 10.0.1.4

2025/05/25

今天再度測試了一下PVE的firewall功能
發現只要打開cluster的firewall
預設就會載入很多firewall的rule 而且無法刪除
但在測試過程中發現竟然有 guest 原本提供服務的https 打不開了
而且原本使用 nmap做的一些測試也被擋了
最後決定在每台host直接下iptables 指令

#!/bin/bash

######## 以下是防護 host ##############
/usr/sbin/iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -s 0/0 --dport 22 -j DROP
/usr/sbin/iptables -A INPUT -p tcp -s 0/0 --dport 8006 -j DROP

######## 以下是防護 guest  視需求新增  port #############
/usr/sbin/iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT
/usr/sbin/iptables -A FORWARD -p tcp -s 0/0 --dport 22 -j DROP
/usr/sbin/iptables -A FORWARD -p tcp -s 0/0 --dport 8006 -j DROP
/usr/sbin/iptables -A FORWARD -p tcp -s 0/0 --dport 8007 -j DROP

記得寫在 crontab  @reboot

2025/05/18

另一個集中管理主几的好物



安裝超級簡單

npm install meshcentral

官網的說明是啟動LAN 模式 只能在同網段 client 使用 multicast找到server

node node_modules/meshcentral



如果要跨網段 要使用以下指令啟動 加上server的 ip

node node_modules/meshcentral --cert 10.0.0.1

安裝完成請馬上登入 https://10.0.0.1
建立帳號 第一個建立的帳號就是系統的管理帳號
建完帳號後再以此帳號登入

接下來是處理被控端的 agent 程式 直接從web管理介面上即可下載















可選擇不同的OS 及版本
agent 程式放到client後可選擇只執行連線 或 安裝成service
連線成功後即會出現在如上圖的位置 可在管理介面上操控

2025/05/17

隨著docker使用的愈來愈多
更新管理這件事也變的重要
找到watchtower這個工具 還滿方便使用的

部署方式如下

docker run -d --restart=always \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup --remove-volumes \
--interval 86400

預設檢查時間是 86400 秒 可視需求調整


如果需要只email通知而不更新

docker run -d --restart=always \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_NOTIFICATIONS=email \
-e WATCHTOWER_NOTIFICATION_EMAIL_FROM=from@example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_TO=to@example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=from@example.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=yourpassword \
  containrrr/watchtower \
  --monitor-only \
  --interval 86400 \



2025/05/16

裝好 guacamole 在管理介面几個要注意的地方

先建立連接

建立RDP連接時 如果一直無法連線 要調整安全模式
各個不同模式都試看看




















再來是螢幕錄影
路徑要跟 啟動docker 時 對應的路徑相同
名稱一定要設定 我這裡是跟連接設定相同名稱 方便識別
錄影檔只會有一個名稱為主的檔名 然後接續 .1 .2 .3 ...新增
要觀看必須要使用 guacenc 轉檔


















以下設定開啟檔案傳輸功能 就可以把檔案直接拖進瀏覽器內























在client產生一個共用資料夾 控制端把檔案拖進瀏覽器實際上是拖進這個共用資料夾內
這個資料夾是 guacd 這個docker的 /tmp
 











如果要從被控几下載檔案到控制几 要先把要下載的檔案放到這個資料夾內
之後在瀏覽器上 按 ctrl+alt+shift 打開側边欄 點選 shared Drive
就可以看到能下載的檔案 直接下載即可 
也可以在這個視窗上傳檔案到共用資料夾內























再來就是注意一定要設定時區
避免log對不上的問題

ctrl+alt+shift 可以叫出側邊功能面版 

2025/05/15

昨天有人介紹了一個可以管制登入並且螢幕錄影的軟体


今天試了一下
先安裝 本次都以docker 安裝
先pull四個image

網頁前端
docker pull guacamole/guacamole

主体程式
docker pull guacamole/guacd

資料庫
docker pull mysql

影像檔轉檔程式
docker pull litios/guacenc


在宿主几建立存放影像檔的資料夾 並提供給docker 掛載
mkdir /opt/screen_record
cd /opt
chmod -R 777 screen_record

啟動資料庫
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=guacamole mysql


生成並導入Guacamole初始化資料庫:

docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql
docker cp initdb.sql mysql:/
docker exec -it mysql bash
mysql -uroot -p
create database guac;
use guac;
source /initdb.sql;
exit
exit

啟動guacd 同時掛載影像檔目錄

docker run --name guacd -d -v /opt/screen_record:/recordings guacamole/guacd


啟動Guacamole Web應用,連結guacd和mysql:

docker run --name guacamole --link guacd:guacd --link mysql:mysql \
-e MYSQL_DATABASE=guac -e MYSQL_USER=root -e MYSQL_PASSWORD=guacamole \
-d -p 9090:8080 guacamole/guacamole


啟動guacenc 同時掛載影像檔目錄

docker run -v /opt/screen_record:/recordings -d -it --name guacenc litios/guacenc


瀏覽器訪問 http://你的IP:9090/guacamole,預設帳號密碼均為 guacadmin。


影像檔轉檔為m4v 指令
docker exec -it guacenc guacenc -s 1280x720 -r 20000000 -f /recordings/record_file_name


更新docker 開几重啟
docker update --restart always <容器ID或名稱>


下篇再補上操作介面說明

2025/05/12

因為ssl加解密的几制已經搞很久了還是有問題
所以找看看其他的解決方案
這几天試了一下 nginx 的 mirror 功能
記錄一下

在要執行 mirror 的 nginx 上設定如下

server {
    listen 443 ssl;
    server_name aaa.com.tw;


    ssl_certificate /etc/ssl/certs/server.cer;
    ssl_certificate_key /etc/ssl/certs/server.key;


    location / {
        proxy_pass http://primary_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        mirror /mirror;

        mirror_request_body on;
    }

    location /mirror {
        internal;
        proxy_pass http://secondary_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 1s;
        proxy_connect_timeout 1s;
    }
}

upstream primary_backend {
    server 10.0.0.1:80;
}

upstream secondary_backend {
    server 10.0.0.2:80;
}

10.0.0.1 是提供服務的server

10.0.0.2 接收 mirror過來的內容

10.0.0.1 10.0.0.2 二台都必須要起web server並listen 非加密的 80 port

10.0.0.2只需要啟動即可 不需要跟 10.0.0.1有相同的網頁內容
因為如果10.0.0.2沒有 web server  mirror過來的封包會被直接丟掉 

同時在 10.0.0.2上啟動 ids 軟体 如 snort, suricata 等 分析mirror過來的內容

10.0.0.1會把client的request解密後同時送到 10.0.0.1 10.0.0.2 

但不會 mirror server response 的內容


10.0.0.2 上的nginx access log 預設會記錄 10.0.0.1這個ip
如果要改成 request client的ip  nginx.conf 要新增以下內容

server {
    set_real_ip_from 10.0.0.1;
    real_ip_header X-Real-IP;



2025/05/06

昨天才注意到grafana最近的更新多了 Drilldown 這個功能
目前會用到的是log這個
之前要搜尋資料是到 Explore 這裡
現在直接到 Drilldown 就可以了
關鍵字預設會高亮
很方便

2025/05/05

最近試了一下 openobserve

直接下載執行即可

還滿方便的

速度也很快

功能很多

但在查詢上不是那麼方便

沒辦法直接使用關鍵字

執行複雜查詢的時候更麻煩

看之後會不會改進這個問題


https://openobserve.ai/

2025/04/25

近期用rclone備份到google時會一直出現如下的錯誤而不成功

 2025/04/23 09:00:26 ERROR : testdisk-7.1-WIP/icons/scalable/apps: error reading destination directory: couldn't list directory: googleapi: Error 403: Quota exceeded for quota metric 'Queries' and limit 'Queries per minute' of service 'drive.googleapis.com' for consumer 'project_number:20644'.

Details:

[

  {

    "@type": "type.googleapis.com/google.rpc.ErrorInfo",

    "domain": "googleapis.com",

    "metadata": {

      "consumer": "projects/20644",

      "quota_limit": "defaultPerMinutePerProject",

      "quota_limit_value": "420000",

      "quota_location": "global",

      "quota_metric": "drive.googleapis.com/default",

      "service": "drive.googleapis.com"

    },

    "reason": "RATE_LIMIT_EXCEEDED"

  },

  {

    "@type": "type.googleapis.com/google.rpc.Help",

    "links": [

      {

        "description": "Request a higher quota limit.",

        "url": "https://cloud.google.com/docs/quotas/help/request_increase"

      }

    ]

  }

]

, rateLimitExceeded


應該是google調整了備分api的相關設定

必須在 rclone加上以下的參數才行


--drive-chunk-size 256M --transfers=3 --tpslimit 3



2025/04/08

早上發現所有lxc的備分都沒有成功
出現如下的log

'/mnt/pve/nfs98_bck/dump/vzdump-lxc-123-2025_04_06-21_24_12.tar.zst'
INFO: tar: /mnt/pve/nfs98_bck/dump/vzdump-lxc-123-2025_04_06-21_24_12.tmp: Cannot open: Permission denied
INFO: tar: Error is not recoverable: exiting now

之前用qnap備分都沒問題 換成群灰就不行了
查了一下有二個解決方法

1.
把 tmpdir 指到 /tmp

vi /etc//etc/vzdump.conf

#tmpdir: DIR
tmpdir: /tmp


2.
改變群灰 共用資料夾 nfs權限
























2025/03/20

之前一直都是使用nc來傳資料到 syslog
但這几天發現做好的檔案都被砍了
反正eset現在不允許nc的執行
另外找了一個 sfk
之前有試過 但當時有不少bug
語法如下

sfk oload log.txt +udpsend 10.0.0.1:514


2025/03/15

最近又有人反應讀取mail的速度很慢
讀寫大量小檔的效能基本上很難提升
查到使用 noatime nodiratime 應該可以改善一些
原理讀取時不會再去update 檔案資訊 
這裡說的資訊如下 

stat test

檔案:test
  大小:87              區塊:8          IO 區塊:4096   一般檔案
裝置:801h/2049d        Inode:15466774    實際連結 (hardlink) :1
權限:(0664/-rw-rw-r--)    Uid:( 1000/      aa)  Gid:( 1000/      aa)
最近存取:2025-03-15 08:40:59.971496391 +0800
最近變更:2020-10-14 05:42:44.007905808 +0800
最近變更:2020-10-14 05:42:44.059906505 +0800
建立時間:-

把以上二個參數加到 /etc/fstab裡要作用的分區 再remount 即可

UUID=xxxx-xxxx-xxxx-xxxx /home xfs defaults,noatime,nodiratime 0 0


再觀察看看效果有多少