蓝队日志溯源

windwos主机信息收集

Windows主机信息收集

powershell命令历史记录

可以使用powershell进行查看

powershell Get-Content (Get-PSReadlineOption).HistorySavePath

某些情况下,该命令可能无法使用,我们可先用dir查看powershell历史命令记录文件的存放位置,然后使用type进行读取

%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
%appdata%\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

PS:打点时遇到Windows环境的文件下载漏洞,可下载以下文件进行敏感信息翻阅,某些运维会使用powershell进行管理工作组或域内机器,运气好的可以找到ssh、数据库这类登录密码或其它重要文件,尤其是一些运维用的脚本,里面大多包含主机、数据库登录密码,可通过powershell历史记录找到这些脚本的绝对路径,然后在使用文件下载漏洞进行读取,这也是一个不错的突破点,而且这些历史命令大多包含链接主机信息,可提取里面的IP段,扩宽我们的攻击面。

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

渗透结束时,如果使用过powershell的,务必清除powershell命令历史记录,在一定程度上可以减少被溯源成功的概率,当然,也可以迷惑蓝队,写入一些奇怪的命令,例如把上线的C2地址更改为境外的已公开IOC情报的挖矿IP,然后丢进来几个挖坑样本,误导蓝队进行溯源消耗防守方的精力,伪造痕迹的时候记得更改文件时间,还得注意下语言文字这些细节,不然蓝队看到中文名字、错误语法和时间的挖矿,结合攻防演练时间,第一时间肯定会知道这是伪造出来的,如果内网存在IDS这样的流量审计设备,蓝队一定位机器查看设备流量,说不定还可能暴露我们的踪迹

这目录里面放着电脑的历史打开文件记录,看过什么文件、什么时候,包括点过那几个盘,都很详细的记录,我们可通过该目录定位运维常用的文件夹、文件等,寻找敏感信息,查看这个目录往往有奇效,很多时候运维为了方便管理机器喜欢用密码小本本来记录各个机器的密码,毕竟一个运维管理几十台机器是非常常见,这么多密码不一定记得住,所以大多数运维会选择把机器密码记录在txt、xls这种文件里,这也就给了我们可乘之机,其实我在这个目录遇到最多的还是运维写的日报、周报,很多时候这些报告里面包含了大量服务器信息,这时候我们就可以通过这些敏感信息进一步内网横向。

recent

大多数时候我们的起点都是webshell权限,如果没有判断管理员是否在线,是否有IDS这种流量检测设备,那么在第一时间最好不要冒然远程过去,不然就是得不偿失了;recent无法使用,这时候我们可以使用dir读取历史打开文件,然后再利用dir搜索关键字得到文件的绝对路径,这样我们就可以直接在webshell中进行查看或下载回来本地打开了。

dir %APPDATA%\Microsoft\Windows\Recent
dir C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Recent
dir /a /s /b c:\password.txt

其它的常用关键字搜索,

dir /a /s /b c:\*.conf *.ini *.inc *.config 
dir /a /s /b c:\conf.* config.*
dir /a /s /b c:\*.txt *.xls *.xlsx *.docx
findstr /s /i /n /d:C:\ /c:"pass" *.config

某些时候显示内容过多,可对这些关键字进行逐个搜索,或使用findstr进行过滤,如:

dir /a /s /b c:\*.conf *.ini *.inc *.config | findstr "运维"
dir /a /s /b c:\*.txt *.xls *.xlsx *.docx | findstr "密码"

另外可到回收站翻翻,很多时候会有惊喜。

前面说到了recent目录记录到了查看历史打开文件,在后渗透时,我们通常会往目标机子上传各种文件,例如nps、mimikatz、psexec等,这些工具在使用过程中,大多会在recent目录产生记录,这时候为了更好的隐藏痕迹,我们可以rd命令删除运行记录或直接使用CS或webshell管理工具提供的文件管理功能删除该记录,另外psexec成功登录退出后,会在目标机器的安全日志中产生Event 4624、4628、4634,在系统日志中产生Event 7045(记录PSEXESVC安装)、Event 7036(记录PSEXESVC服务状态),Windows日志也需要处理下;关于清理痕迹不是本文的主题,就不多赘述了,对于应急的同学可以多关注下recent文件夹和Windows日志,在不手动清理或者使用某些安全工具清理垃圾的时候,recent这个目录为空或者很少东西,那么应该要注意下了。

rd /s 文件

windows 日志路径:

系统日志:%SystemRoot%\System32\Winevt\Logs\System.evtx
安全日志:%SystemRoot%\System32\Winevt\Logs\Security.evtx
应用程序日志:%SystemRoot%\System32\Winevt\Logs\Application.evtx
日志在注册表的键:HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\Eventlog
IIS默认日志位置:%SystemDrive%\inetpub\logs\LogFiles\W3SVC1\

powershell清除Windows事件日志

PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"
Get-WinEvent -ListLog Application,Setup,Security -Force | % {Wevtutil.exe cl $_.Logname}

PS:上传后的文件如果不能删除(没权限或其它因素),那么可以上传或新建同名文件,覆盖掉原有文件。

敏感文件寻找

  • 服务器、中间件、数据库这类配置文件。
  • 运维密码、工作记录、个人记录这些。
  • 公司文件、合同、网络拓扑图这类。
  • ……

服务器、中间件、数据库这类配置文件的重要性大家都懂,渗透的时候如果获取到一个包含大量敏感信息的配置文件,那将会为我们在后渗透作出良好的铺垫,如下。

某次项目时,拿到一个存在内网的shell,通过对主机信息收集,发现某配置文件Config-back.xml包含了大量的数据库账号密码,之后使用CS下载该配置文件到本地,然后搭建代理利用这些账号密码批量上线MSSQL主机,再结合这些密码制作出高质量字典爆破C段机器,用了不到30分钟拿到了200多台机器权限,所以说渗透的本质是信息搜集,信息搜集的量决定着我们渗透的成果,关于配置文件的查找这里就不多说了,可参考上面的dir命令进行查找。

dir /a /s /b d:\conf.* config.*

另外就是要多关注下web系统本身存放的文件,之前遇到过一个IBM系统,里面有个云盘功能,之后翻这个功能模块找到了个运维建立的文件夹,里面存放了大量的数据,什么网络拓扑图、运维日志、甚至还有账号密码,还有的就是做等保渗透的时候,远程到运维机,桌面一大堆设备清单,还有各个系统的账号密码,而且这些xlsx表格都是不加密的,直接打开就能查看,一些运维为了贪图方便,往往会非常严重的安全隐患,给了入侵者很大的机会。

这里再补充一下WiFi密码获取这个点,在内网渗透,密码获取到的越多,路就越好走,很多时候内网的密码都是通用的,就算是不通用,大部分的密码也是有规律可循的,关于密码的获取可使用LaZagne

CMD获取WiFi密码

netsh wlan show profiles
netsh wlan show profiles name="WiFi名称" key=clear

通过for循环一次性获取全部WiFi密码
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear

如果已经取得当前机器的管理员权限的话,可运行mimikatz、procdump之类凭据获取工具获取系统凭据,因为多数管理员可能使用同一密码或有规律性的密码来管理多台服务器,如果能够得到主机密码或者hash就可以尝试pth或psexec批量上线了;还有就是在进程收集的时候要多留意一下是否有域管启用的进程,如果刚好域管理员登录过我们已经有权限的机器,那么就可以利用域管进程进行横向了,如果没有的话可关注下ms14068,域委派这类东西,这些都是后渗透基本常识了,这里不多赘述。

域信息收集常用命令

常用命令

net use  查看ipc连接情况
net user /domain 获取域用户列表
net user test 123 /add 添加用户
neet localgroup administrators test /add 添加test用户到管理组,一般情况下,管理组才能远程桌面
net group /domain 查询域里面的组
net group "domain admins" /domain 获取域管理员列表
net group "enterprise admins" /domain 查看当前域中企业管理员组用户
net group "domain computers" /domain 查看当前域中的所有的计算机名(登录过该域的计算机)
net group "exchange servers" /domain 查看域内是否存在Exchange
net group "domain controllers" /domain 查看域控制器(如果有多台)
net config workstation 查看当前登录域
net view 查看同一域内机器列表
net view \\ip 查看某IP共享
net view \\test 查看test计算机的共享资源列表
net view /domain 查看内网存在多少个域
Net view /domain:test 查看test域中的机器列表
wmic useraccount get Caption,sid 获取域内所有用户sid
setspn -T target.com -Q */* 获取当前域内所有spn
for /l %i in (1,1,255) do @ping 192.168.0.%i -w 1 -n 1 | find /i"ttl"
for /l %i in (1,1,255) do @ping 10.10.10.%i -w 1 -n 1 | find /i"ttl"

网络信息查找

ipconfig /all   查看当前主机的主机名/IP/DNS等信息
route print 查看路由表信息
netstat -ano 查看开放情况,有些时候能获取到别的IP段
arp -a 查看arp解析情况

寻找内网网段时建议被动寻找,主动寻找动静太大,如nmap、nbtscan这种一扫,可能整个网段内存活的机器就出来了,但随之而来的是IDS的流量审计,一旦引起流量异常被蓝队察觉,可能就会导致我们权限的丢失,永远不要小瞧蓝队,而且还是拥有各种安全设备的蓝队,内网渗透一定要谨慎,大规模资产扫描,自动化漏洞扫描我一般会留到最后才上的。

定位域控

查看域时间,一般域控会做时间服务器

net time /domain

通过dns定位域控

ipconfig /allipconfig /displaydns   有些时候可以在dns缓存得到域控信息

利用netdom获取域控列表,得到域控名称可通过ping获取域控IP

netdom query dc

其它信息查找

systeminfo  查看补丁情况,也能看到当前机器是否加入域环境
net group "domain controllers" /domain 查询域控
nslookup -type=SRV _ldap._tcp.corp 通过srv记录获取域控地址
nltest /dclist:corp 使用nltest查询域控列表
tasklist /svc 查看进程及对应服务名
cmdkey /l 查看当前保存的登陆凭证
type c:\Windows\system32\drivers\etc\hosts 可以发现些内网IP

其它补充

web日志

有些老系统会使用get+明文的方式传输后台登录账号密码,我们可翻查下web日志,说不定有收获,还有就是要注意系统本身的日志,这些日志大多包含内网IP段,甚至还有账号密码这些东西。

使用net1.exe绕过杀软添加用户

windows环境渗透添加用户往往会被AV拦截,而且还会产生告警日志,这时候可使用net1.exe绕过杀软添加用户,当然,也可使用cs自带的argue参数污染进行用户添加。

net1.exe

cd c:/windows/system32
copy net1.exe svchost.txt
svchost.txt user svchost M@Bas#as#@123 /add
net localgroup administrators svchost /add
svchost.txt user svchost M@Bas#as#@123 /add & net localgroup administrators svchost /add

argue参数污染

net1 argue net1 aaaaaaaaaaaaaaaaaaaaaaaassssssssssssssssssssssssssssssssssssssssssssssssss
execute net1 user svchost M@Bas#as#@123 /add
execute net1 localgroup administrators svchost /add

正常使用net添加用户会被火绒拦截

添加用户并加到管理员组

m1kh.txt user m1kh  M@Bas#as#@123 /add & net localgroup administrators m1kh /add

linux主机信息收集

网络信息收集

last                                    多数运维会接入内网登录系统,这时候,便可获取部分内网ip 进而对内网IP段进行画像
Ifconfig -a/arp -a/netstat -anopt/ss -nt 这些就不多说了
Route -n 内网路由情况,也能为内网网络拓扑提供一定的信息
IPtables 防火墙情况,有时候会存在内网网络通行规则,也能提供一定信息
....

敏感文件收集

grep "password:" * -Rn
find / -name "config.*"
find / -name "databases.*"
find / -name "config.*" | xargs grep "password""

其他补充

history命令

history 在linux渗透时是非常实用的,各种连接密码,ssh、mysql、ftp等等,在拿到权限是应该着重看看这个文件

日志相关命令

last命令记录着所有用户登录系统的日志,可以用来查找非授权用户的登录事件,而last命令的输出结果来源于/var/log/wtmp文件,稍有经验的入侵者都会删掉/var/log/wtmp以清除自己行踪,但是还是会露出蛛丝马迹在此文件中的。

可用以下命令分析用户登录行为

who                     查看当前登录用户(tty本地登陆  pts远程登录)
w 查看某一时刻用户的行为
uptime 查看有多少用户,以此确定是否存在异常用户
lastb 显示登录失败次数,判断是存在ssh爆破
last 显示用户最近登录信息。
lastlog 登录成功记录

进程和端口检查

进程检查

用ps命令查看服务器上的所有进程,定位恶意进程。

ps -a               列出的是当前控制终端启动的进程
ps -A 系统全部启动进程
ps auxf 查看父进程关联的子进程
pstree 查看进程树

进程过多的话也可以用命令:ps -aux | grep 进程名 定位到恶意程序

ps -aux | grep 进程名

proc

这里简要说一下proc:

/proc 是一个伪文件系统,这个伪文件系统让你可以和内核内部数据结构进行交互,与真正的文件系统不同的是它是存在于内存中而不是真正的硬盘上,所以重启后/proc会被重置掉,linux 下有一个说法即一切皆文件,所有在linux上运行的程序都在/proc下有一个自己的目录,目录名字为程序的Pid号,目录里面存储着许多关于进程的信息,列如进程状态status,进程启动时的相关命令cmdline,进程的内存映像maps,进程包含的所有相关的文件描述符fd文件夹等等
其中 /proc/pid/fd 中包含着进程打开的所有文件的文件描述符,这些文件描述符看起来像链接文件一样,通过ls -l 你可以看见这些文件的具体位置,但是它们并不是简单连接文件,你可以通过这些文件描述符再打开这些文件,你可以重新获得一个新的文件描述符,即使这些文件在你所在的位置是不能访问,你依然可以打开。 还一个 /proc/pid/exe 文件,这个文件指向进程本身的可执行文件。

所以在得到PID后,我们就能利用以下命令获取该PID所对应的进程文件路径,获取进程的详细信息了:

ls -l /proc/$PID/exe
file /proc/$PID/exe($PID 为对应的pid 号)
which name 查看程序在哪个文件夹 name表示程序名
lsof /usr/bin/* 查看某个路径下的运行中的进程列表
pidof /usr/bin/*

history信息检查

攻击者入侵后,往往会顺手把历史操作命令给清除掉(history -c),但此命令并不会清除保存在文件中的记录,因此打开/home各帐号目录下的.bash_history,查看每个用户目录下的.bash_history文件,特别是/root目录下的.bash_history文件,此文件中记录着用户执行的所有历史命令,很多时候攻击者会通过wget下载恶意木马到服务器,这时候查看history说不定就能捕获攻击者的C2服务器了。

history
cat /root/.bash_history > root_history.txt
history -w

history优化

cat /etc/ssh/sshd_config

历史的命令增加登录的IP地址、执行命令时间等信息:
1. 保存1万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile

2. 在/etc/profile的文件尾部添加如下行数配置信息:
##history优化
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"

3. source /etc/profile让配置生效

生成效果: 329 2021-04-14 16:39:43 183.6.56.66 root cat /etc/profile

主机服务分析

枚举主机所有服务,查看是否有恶意服务。

service --status-all
chkconfig –list #列出所有的系统服务

定时任务分析

定时任务对于玩CTF和做渗透的师傅应该都不陌生

查看单个用户的定时任务

crontab -l

循环遍历所有用户的定时任务

for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done

anacron异步定时任务查看

cat /etc/anacrontab

除此之外,以下目录中也可能存在恶意脚本,需进一步排查。

/var/spool/cron/* 
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*

查看CPU运行

定位挖矿时很实用

top

ssh秘钥分析

redis未授权访问漏洞可直接向服务器写入公钥,从而实现无密码登录服务器,之前也写过类似的文章,所以要重点关注/etc/.ssh、 ~/.ssh 目录下有无可疑公钥

ll -al /etc/ssh/
ll -al /root/.ssh/

日志分析

查看日志是查找攻击源最好的方法,虽然耗时长;linux日志默认存放位置:/var/log/

查看日志配置情况:more /etc/rsyslog.conf


日志文件 说明
/var/log/cron 记录了系统定时任务相关的日志
/var/log/cups 记录打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/mailog 记录邮件信息
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/btmp 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/log/utmp 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/secure 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中

主机日志分析

查看登录失败信息

grep -o "Failed password" /var/log/secure|uniq -c

输出登录爆破的第一行和最后一行,确认爆破时间范围

grep "Failed password" /var/log/secure|head -1 
grep "Failed password" /var/log/secure|tail -1

查看有哪些IP在爆破root帐号

grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

输出有爆破行为的IP

grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

输出被爆破的用户名

grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

查看登录成功的日期、用户名、IP

grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

查看哪些IP登录成功了

grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

web日志分析

先统计请求ip,方便后续分析(取出日志可用sz命令或者xftp)

awk '{print $1}' blog.m1kh.com.log | sort | uniq -c | sort -rn | more
awk '{print $1}' blog.m1kh.com.log | sort | uniq -c | sort -rn >

统计下日志有多少行

wc -l blog.m1kh.com.log					#-l统计行数
cat -n blog.m1kh.com.log | tail -1

状态码统计

cat blog.m1kh.com.log  |awk '{print $9}'|sort|uniq -c|sort -rn

URL 统计(200)

grep "183.6.56.66" blog.m1kh.com.log |  awk '{if ($9==200) print $1,$7,$9}'

查看并统计200的状态码及ip(去重后)

cat blog.m1kh.com.log  | awk '{if ($9=200) print $1,$7,$9}'|sort|uniq -c|sort -rn | head -20

有时候遇到目录扫描会产生大量日志,这时候我们可以分开看,可用awk进行分割,只看状态码为200的。

more blog.m1kh.com.log | egrep "\.zip|\.rar|\.mdb|\.inc|\.sql|\.config|\.bak|/login.inc.php|/.svn/|/mysql/|config.inc.php|\.bak|wwwroot|网站备份|/gf_admin/|/DataBackup/|/Web.config|/web.config|/1.txt|/test.txt|www.zip|www.tar" > test.log
[root@m1kh wwwlogs]# more test.log | awk '{if($9==200) {print $1,$2,$3,$4,$6,$7,$8,$9}}'
183.6.56.66 - - [12/Apr/2021:18:14:44 "GET /config.inc.php HTTP/2.0" 200
183.6.56.66 - - [12/Apr/2021:18:14:45 "GET /config.inc.php HTTP/2.0" 200

杂项

开机启动的一些路径

/etc/rc.d/rc
/etc/rc
/etc/rc.local
/etc/rc.d/rc.local
/etc/rc.d/rc
/etc/rc$runlevel.d/ 该目录下都是链接的可执行文件,也可以自己添加可执行程序
/etc/ld.so.cache
/etc/ld.so.preload
/usr/local/lib/libioset.so
/etc/init.d
另外一个添加启动项的地方在 /etc/profile里面,还有 /etc/profile.d/目录下以sh结尾的文件

grep指令

2、grep 查找含有某字符串的所有文件

grep -rn "hello,world!" 
* : 表示当前目录所有文件,也可以是某个文件名
-r 是递归查找
-n 是显示行号
-R 查找所有文件包含子目录
-i 忽略大小写

4、find /etc -name init

//在目录/etc中查找文件init
A、/var/log/secure

1、定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

2、登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

3、增加一个用户kali日志:
Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
#grep "useradd" /var/log/secure

4、删除用户kali日志:
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
# grep "userdel" /var/log/secure

5、su切换用户:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)

sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
Author

vague huang

Posted on

2021-12-03

Updated on

2022-09-22

Licensed under

Comments