分类 笔记 下的文章

一个Let's Encrypt SSL证书的一键脚本{扣自LNMP}

代码扣自 LNMP 和 vpser的 acme.sh


用法:以dnspod为示例

先把dnspod的token 设置环境变量

# export DP_Id="你的Token ID" && export DP_Key="你的Token Key"


随后执行脚本然后一路根据提示操作即可

# ./cert dp


#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# Check if user is root
if [ $(id -u) != "0" ]; then
	echo "Error: You must be root to run this script!"
	exit 1
fi

cert_path=$(pwd)
cert_path="$cert_path/ssl_cert"

echo "+-------------------------------------------+"
echo "|    Let's Encrypt SSL Certificate issue    |"
echo "|           By:7xCode                       |"
echo "|               https://www.7xcode.com      |"
echo "+-------------------------------------------+"

arg1=$1

Color_Text()
{
  echo -e " \e[0;$2m$1\e[0m"
}

Echo_Red()
{
  echo $(Color_Text "$1" "31")
}

Echo_Green()
{
  echo $(Color_Text "$1" "32")
}

Echo_Yellow()
{
  echo -n $(Color_Text "$1" "33")
}

Echo_Blue()
{
  echo $(Color_Text "$1" "34")
}

Sleep_Sec()
{
	seconds=$1
	while [ "${seconds}" -ge "0" ];do
	  echo -ne "\r	 \r"
	  echo -n ${seconds}
	  seconds=$(($seconds - 1))
	  sleep 1
	done
	echo -ne "\r"
}

Install_Check_Acme.sh()
{
	if [ -s /usr/local/acme.sh/acme.sh ]; then
		echo "/usr/local/acme.sh/acme.sh [found]"
	else
		cd /tmp
		[[ -f latest.tar.gz ]] && rm -f latest.tar.gz
		wget https://soft.vpser.net/lib/acme.sh/latest.tar.gz --prefer-family=IPv4 --no-check-certificate
		tar zxf latest.tar.gz
		cd acme.sh-*
		./acme.sh --install --log --home /usr/local/acme.sh --certhome ${cert_path}
		cd ..
		rm -f latest.tar.gz
		rm -rf acme.sh-*
		sed -i 's/cat "\$CERT_PATH"$/#cat "\$CERT_PATH"/g' /usr/local/acme.sh/acme.sh
		if command -v yum >/dev/null 2>&1; then
			service crond restart
			chkconfig crond on
		elif command -v apt-get >/dev/null 2>&1; then
			/etc/init.d/cron restart
			update-rc.d cron defaults
		fi
	fi

	. "/usr/local/acme.sh/acme.sh.env"
}

Add_SSL_Info_Menu()
{
	domain=""
	while :;do
		Echo_Yellow "Please enter domain(example: 7xcode.com): "
		read domain
		if [ "${domain}" != "" ]; then
			echo " Your domain: ${domain}"
			break
		else
			Echo_Red "Domain name can't be empty!"
		fi
	done

	Echo_Yellow "Enter more domain name(example: www.7xcode.com blog.7xcode.com *.7xcode.com): "
	read moredomain
	if [ "${moredomain}" != "" ]; then
		echo " domain list: ${moredomain}"
	fi
}

Add_Dns_SSL()
{
	provider=$1
	if [ "${provider}" != "" ]; then
		dns_provider="dns_${provider}"
	else
		Echo_Red "The dns manual mode can not renew automatically, you must renew it manually."
	fi

	Install_Check_Acme.sh

	if [[ ! -s /usr/local/acme.sh/dnsapi/dns_${provider}.sh && "${provider}" != "" ]]; then
		echo "DNS Provider: ${provider} not found."
		exit 1
	fi
	Add_SSL_Info_Menu

	if [ ! -d "${cert_path}" ]; then
			echo "Create a certificate store root directory"
			mkdir -p "${cert_path}"
	fi

	letsdomain=""
	if [ "${moredomain}" != "" ]; then
		letsdomain="-d ${domain}"
		for i in ${moredomain};do
			letsdomain=${letsdomain}" -d ${i}"
		done
	else
		letsdomain="-d ${domain}"
	fi

	if echo "${letsdomain}" | grep -q '\*\.' && echo "${letsdomain}" | grep -qi 'www\.'; then
		Echo_Red "wildcard SSL certificate DO NOT allow add www. subdomain."
		exit 1
	fi

	echo "Starting create SSL Certificate use Let's Encrypt..."
	if [ "${provider}" != "" ]; then
		/usr/local/acme.sh/acme.sh --issue ${letsdomain} --dns ${dns_provider}
		lets_status=$?
	else
		/usr/local/acme.sh/acme.sh --issue ${letsdomain} --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
		Echo_Yellow "Please add the above TXT record to the domain in 180 seconds!!!"
		echo
		Sleep_Sec 180
		/usr/local/acme.sh/acme.sh --renew ${letsdomain} --yes-I-know-dns-manual-mode-enough-go-ahead-please
		lets_status=$?
	fi
	if [ "${lets_status}" = 0 ] || [[ "${provider}" = "" && "${lets_status}" = 1 ]]; then
		Echo_Green "Let's Encrypt SSL Certificate create successfully."
	else
		Echo_Red "Let's Encrypt SSL Certificate create failed!"
	fi
}


if [ "${arg1}" != "" ]; then
	Add_Dns_SSL ${arg1}
else
	echo "Usage: cert {cx|ali|cf|dp|he|gd|aws}"
fi

exit


Windows 10 LTSC / Server 2016 (Server 2019 ?) 安装WSL(Linux子系统)

以管理员身份打开PowerShell并执行:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

命令执行后重启系统


下载文件:  https://aka.ms/wsl-ubuntu-1804

下载完成后将文件名修改为Ubuntu.zip 并解压到你指定的目录

PowerShell命令解压ZIP

Expand-Archive Ubuntu.zip Ubuntu


以管理员身份打开PowerShell并执行:

$userenv = [System.Environment]::GetEnvironmentVariable("Path", "User")
[System.Environment]::SetEnvironmentVariable("PATH", $userenv + "D:\Ubuntu", "User")

将命令中的Ubuntu目录修改成你的并执行将目录加入当前用户的环境变量中

然后执行命令

.\ubuntu1804.exe

16.04 为 ubuntu1604.exe  18.04 为  ubuntu1804.exe 其他发行版自行查看对应的.exe可执行文件

然后按提示输入用户名和密码就可以了


如果要默认使用root用户登录,以管理员身份打开PowerShell并执行:

ubuntu config --default-user root


Delphi 检测文件数字签名

Uses Winapi.Windows, JwaSoftpub, CAPICOM_TLB, JwaWintrust;

Function IsCodeSigned(const Filename:String):Boolean;
var
  FileInfo   :TWinTrustFileInfo;
  TrustData  :TWinTrustData;
begin
  ZeroMemory(@FileInfo, SizeOf(TWintrustFileInfo));
  ZeroMemory(@TrustData, SizeOf(TWinTrustData));
  FileInfo.cbStruct             := SizeOf(TWintrustFileInfo);
  FileInfo.pcwszFilePath        := PWideChar(FileName);
  TrustData.cbStruct            := sizeof(TrustData);
  TrustData.dwUIChoice          := WTD_UI_NONE;
  TrustData.fdwRevocationChecks := WTD_REVOKE_NONE;
  TrustData.dwUnionChoice       := WTD_CHOICE_FILE;
  TrustData.InfoUnion.pFile     := @FileInfo;
  Result := WinVerifyTrust(INVALID_HANDLE_VALUE, WINTRUST_ACTION_GENERIC_VERIFY_V2, TrustData) = ERROR_SUCCESS;
end;

利用SIO_RCVALL捕获数据来简单查找挖矿木马

只做简单得技术研究,不保证百分百好用。

WSAStartup(MAKEWORD(2, 2), &wsa);
hSniffer = socket(AF_INET, SOCK_RAW, IPPROTO_IP);

LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = 0;
LocalAddr.sin_addr.s_addr = INADDR_NONE;
bind(hSniffer, (struct sockaddr *)&LocalAddr, sizeof(sockaddr_in));
//初始化并绑定Socket举报到本机IP

DWORD sioarg = 1;
DWORD dwValue = 0;
WSAIoctl(hSniffer, SIO_RCVALL, &sioarg, sizeof(DWORD), 0, 0, (LPDWORD)&dwValue, 0, 0);
//使用SIO_RCVALL命令开始捕获

char *Buffer = (char *)malloc(65536);
IPV4_HDR *IPHeader;
TCP_HDR *TCPHeader;
char *lpszStr;

recvfrom(hSniffer, Buffer, 65536, 0, 0, 0);
IPHeader = (IPV4_HDR *)Buffer;
if (IPHeader->ip_protocol == 6) { //判断是否是TCP协议
    TCPHeader = (TCP_HDR*)(Buffer + IPHeader->ip_header_len * 4); //计算偏移定位TCP头
    lpszStr = (char *)(TCPHeader + iLen + TCPHeader->data_offset * 4); //计算数据包得偏移地址
}

//lpszStr 即为TCP数据包得内容

然后挖矿程序得数据包一般为以下格式(注:不保证完全):

{"jsonrpc":"2.0","method":"job","params":{"blob":"01009580fdd4055331f01c7f3a7c15f1d88ae82f82a862e88f854856bc05758100696a96c7475300000000522ab3a142b4935c04121364c53b36266999330985c21c61f234ffd0cdcbbe1e01","job_id":"771459633298218","target":"d8a30200"}}


{"id":3396,"jsonrpc":"2.0","method":"submit","params":{"id":"399161462602205","job_id":"794963340135291","nonce":"74a999d9","result":"13e887bf1e58ad20337f8da518d7abebcc449d754db036bbcfbe4ac9ca0a0000"}}


{"method": "submit", "params": {"id": "341404656460508", "job_id": "771459633298218", "nonce": "ef430500", "result": "4290fef7f43c544c2baebeaa6ce1a459f29cb03afef69517f33acf64237d0200"}, "id":4}


{"id":4,"jsonrpc":"2.0","error":null,"result":{"status":"OK"}}


通过提取关键字来与捕获得TCP数据包内容进行匹配,当数据包中存在以上固定特征后,可通过IPV4头以及TCP协议头中的IP地址字段及端口字段在GetExtendedTcpTable获取到得TCP链接状态链表中查找,pTcpTable->table[?].dwOwningPid 即为相关进程得PID。



另外如果是挖矿程序作者原版得程序一般都会有命令行参数或者在EXE同目录存在config.json文件,我们也可以通过获取进程命令行参数来加以判断。

Chromium Post

var
  Header: ICefStringMultimap;
  Data: ICefPostData;
  Request: ICefRequest;begin
  Request := TCefRequestRef.New;
  Request.Url := 'http://example.com/';
  Request.Method := 'POST';
  Request.Flags := WUR_FLAG_NONE;

  Header := TCefStringMultimapOwn.Create;
  Header.Append('Content-Type', 'application/x-www-form-urlencoded');
  Request.SetHeaderMap(Header);

  Data := TCefPostDataRef.New;
  Data.AddElement(CreateField('Data.id=27'));
  Data.AddElement(CreateField('&Data.title=title'));
  Data.AddElement(CreateField('&Data.body=body'));
  Request.PostData := Data;

  Chromium1.Browser.MainFrame.LoadRequest(Request);end;