Ubuntu 24下安装Asterisk和chan-quectel小记

尝试把Asterisk+chan-quectel部署在了PVE的LXC里的Ubuntu24环境下,配合EC20实现了短信转发到Telegram

安装Asterisk和chan-quectel

apt install asterisk asterisk-dev adb git autoconf automake libsqlite3-dev build-essential libasound2-dev alsa-utils
git clone https://github.com/IchthysMaranatha/asterisk-chan-quectel
cd asterisk-chan-quectel
./bootstrap
./configure --with-astversion=20.6
./configure --with-astversion=20.6 DESTDIR=/usr/lib/x86_64-linux-gnu/asterisk/modules
make
make install

配置USB直通

#LXC配置文件
lxc.cgroup.devices.allow: c 188:* rwm
lxc.mount.entry: /dev/QWS.EC25.AT dev/QWS.EC25.AT none bind,optional,create=file
lxc.mount.entry: /dev/QWS.EC25.NMEA dev/QWS.EC25.NMEA none bind,optional,create=file
#/etc/udev/rules.d/99-qws-usb-serial.rules
SUBSYSTEMS=="usb", ENV{.LOCAL_ifNum}="$attr{bInterfaceNumber}"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{.LOCAL_ifNum}=="01", SYMLINK+="QWS.EC25.NMEA", MODE="0777"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{.LOCAL_ifNum}=="02", SYMLINK+="QWS.EC25.AT", MODE="0777"

配置Asterisk

#/etc/asterisk/quectel.conf
[quectel0]
audio=/dev/QWS.EC25.NMEA ; tty port for Audio, set as ttyUSB4 for Simcom if no other dev present
data=/dev/QWS.EC25.AT ; tty port for AT commands; no default value
#/etc/asterisk/extensions.conf
[incoming-mobile]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})})
;store
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${QUECTELNAME} - ${CALLERID(num)}: ${BASE64_DECODE(${SMS_BASE64})}' >> /var/log/asterisk/sms.txt)
exten => sms,n,System(curl -d 'chat_id={chatid}&text=${URIENCODE(${BASE64_DECODE(${SMS_BASE64})})}\nForm: ${CALLERID(num)}' 'https://api.telegram.org/bot{bottoken}/sendMessage')
exten => sms,n,Hangup()

exten => ussd,1,Verbose(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${QUECTELNAME}: ${BASE64_DECODE(${USSD_BASE64})}' >> /var/log/asterisk/ussd.txt)

exten => ussd,n,Hangup()

exten => _X.,1,System(curl -d 'chat_id={chatid}&text=${URIENCODE(Incoming Call:${CALLERID(num)} )}' 'https://api.telegram.org/bot{bottoken}/sendMessage')
exten => s,1,Verbose('${EXTEN} ${CHANNEL} ${CALLERID(num)} ${INVALID_EXTEN}')
exten => s,n,System(curl -d 'chat_id={chatid}&text=${URIENCODE(Incoming Call:${CALLERID(num)} )}' 'https://api.telegram.org/bot{bottoken}/sendMessage')
exten => s,n,Hangup()

Synology DSM7 Wireguard 安装小记

群晖在新特性方面的支持一直很坑,DSM7还把USB Dongle支持去掉,下次换NAS可能就考虑Synology以外的品牌了。不过在换之前先把Wireguard折腾上吧。

编译Wireguard

参考:https://github.com/runfalk/synology-wireguard

git clone https://github.com/runfalk/synology-wireguard.git
cd synology-wireguard/
sudo docker build -t synobuild .
sudo docker run --rm --privileged --env PACKAGE_ARCH=apollolake --env DSM_VER=7.0 -v $(pwd)/artifacts:/result_spk synobuild

编译跑完之后就可以在文件夹内找到WireGuard-apollolake-1.0.20211208.spk,之后在Package Center里面手动安装。

之后ssh连接到NAS,创建/etc/wireguard/wg0.conf,按正常Wireguard配置,然后执行以下命令。

sudo /var/packages/WireGuard/scripts/start
wg-quick up wg0
wg-autostart enable wg0

之后Wireguard就可以正常运行了。不过考虑到DSM越来越限制All-in-one的使用,下一台NAS可能考虑QNAP之类的了。

参考

http://www.zhaocs.info/enable-wireguard-in-synology-918.html
https://www.youtube.com/watch?v=uPjAirU4occ

Hardening Project 2021 感想

缘由

跳槽来新公司的时候,老板就和我提过说以后需要参加OWASP的活动,然后据说我司曾经获胜多次,因此某天就被老板叫去报名了。网络安全类的比赛应该算是第一次,之前比较多参加的反而是Hackathon的活动,考虑到比赛时间的限制都差不多,很多经验应该可以共享。

总结

这类活动和黑马一样,时间限制都被限制得较死,我觉得以下几点对于参赛者来说比较重要

  • 提前准备好各类工具、脚本
  • 先从最基本的事情做起
  • 团队沟通要顺畅
  • 一个人负责一块,尽量不要有交叉

工具&脚本

考虑到这是一个以运营网站为前提的活动,以下工具是提前准备比较好的

  • 文件传输工具
    • WinSCP (Windows) / ForkLift (Mac)
      简单易用,可以保存密钥。
  • 数据库管理工具
    • Navicat / Sequel Pro / TablePlus
      手搓命令容易翻车,相信GUI
  • 团队协作
    • Notion / Discord
  • 比赛环境
    在办公室吹着空调喝着饮料,放松心情

快速导入团队公钥并拒绝密码登陆

rm -f ~/.ssh/authorized_keys
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
echo "#Key#" >> ~/.ssh/authorized_keys
sudo sed -i 's/#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo service sshd restart

一条命令换掉root密码

echo "root:1145141919" | chpasswd

冻结其他非活跃用户

compgen -u #查看用户一览表
passwd -l user01

连接中转服务器并开启SSH隧道代理

#SSH隧道
export REMOTE_HOST="" 
export REMOTE_PORT="22" 
export REMOTE_USER="proxy" 
ssh -N -f -D localhost:1080 -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST

#经由隧道访问其他SSH
ssh -o ProxyCommand="nc -X 5 -x 127.0.0.1:1080 %h %p" xxx@xxx

#因为RDP不支持Socks5代理,因此可以把远程端口转发至本地后再连接(或者使用Proxifier来强制走代理)
ssh -L 3389: ターゲットIP:3389 xxx@xxx

防火墙

这是这次比赛里翻车最严重的地方,因为我配置错了导致数据库断连了近两个小时,队友也没通知我。主要原因还是现在各个发行版的默认防火墙都有略微区别,手敲iptables容易翻车,建议使用发行版自带的配置工具firewall-cmd/ufw

Firewall-cmd

sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --add-rich-rule="rule family="ipv4" source address="" port protocol="tcp" port="22" accept" #允许中转机器访问ssh
sudo firewall-cmd --remove-service=ssh
sudo firewall-cmd --add-service=dns
sudo firewall-cmd --add-service=smtp
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --add-service=mysql
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reload

ufw

sudo ufw enable
sudo ufw default deny 
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow from xxx.xxx.xxx.xx to any port 22 proto tcp

处理顺序

因为这是一个8个小时左右就结束的活动,因此主办方会使用的方法能做到简单预测,且因留有一个小时的准备时间,把最基本的事情做好还是比较重要的。

  1. 更改root密码、停用非活动账户
  2. 配置系统防火墙,限制端口暴露
  3. 配置自动备份脚本
  4. 修改数据库root密码,分离数据库,限制IP
  5. 检查CMS的设置(新用户权限、评论、插件等)
    —-以上为必做—-
  6. 检查Apache/Nginx权限,限制跨域访问
  7. 如果有非开源CMS存在,检查源代码
  8. 配置网络防火墙(VyOS),隔离机器访问

团队沟通

这次选用的是Notion来作为进度管理,但中途犯了一件错误,禁止复读机!(一个项目一个页面,不要重复),管理密码的页面因为沟通不畅的原因出现了重复,导致有些密码没有及时同步到另外一个页面,查找密码的时间增长。

这次由于是远程参赛,所以大家都在Discord里语音,语音虽然在传达上非常效率,但在大家都很忙的情况下容易把任务给忘掉,如果出现了问题,一定要用文字留下描述,不仅方便跟进,也方便时候查看时间点

另外团队人手不足的情况下,任务范围尽量不要又交叉,容易导致沟通失效。例如这次数据库单独拆分出去了,但修改数据库信息时又需要修改程序的配置,然而这次负责数据库的人完全没管程序那边,直接改掉了数据库信息导致服务下线。以防类似的情况,最好两个区域都由同一个人负责。

感想

这次原本打算划水一下不拿个倒数第一就行,结果就。。获胜了!XD

Image

Asterisk SMS转发/来电通知到Telegram

之前一直使用Raspi4配合RasPBX(http://www.raspberry-asterisk.org/)接收短信和电话,最近因为某些原因换掉了这套方案,但应该有不少人有这个需求,所以把我写的规则发布出来。

将#chatid#和#botkey#替换之后塞入extensions_custom.conf即可,telegram的bot和chatid请自行想办法获取。

[from-trunk-dongle]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})})
exten => sms,n,Set(FILE(/var/log/asterisk/sms.txt,,,a)=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME} - ${CALLERID(num)}: ${BASE64_DECODE(${SMS_BASE64})})
exten => sms,n,System(echo >> /var/log/asterisk/sms.txt)
exten => sms,n,System(curl -d 'chat_id=#chatid#&text=${URIENCODE(${BASE64_DECODE(${SMS_BASE64})})}\nForm:${DONGLENAME} - ${CALLERID(num)}' 'https://api.telegram.org/#botkey#/sendMessage')
exten => sms,n,Hangup()
exten => _X.,1,Set(CALLERID(name)=${CALLERID(num)})
exten => _X.,n,System(curl -d 'chat_id=#chatid#&text=${URIENCODE(Incoming Call:${CALLERID(num)} via ${DONGLENAME})}' 'https://api.telegram.org/#botkey#/sendMessa
ge')
exten => _X.,n,Goto(from-trunk,${EXTEN},1)

ドコモメール(@docomo.ne.jp)远程接收并转发至其他邮箱

自从开始用docomo全家桶之后,我就把@docomo.ne.jp的邮箱用回来了,然而前段时间收到的垃圾邮件让我对这个日本第一大通讯公司的邮件过滤系统表示怀疑。

群众们喜闻乐见的那啥

可能有小朋友会问冯老师:有垃圾邮件把它标记一下然后不就不会再收到了吗?
你太小看日本的系统了,怎么会给你那么高级的功能呢。docomo邮箱仅支持IMAP,所以是没法通过GMail收件了,转了一圈只有outlook提供相对靠谱的代收服务,但延迟大概在10到30分钟这样,虽然服务器上有IMAP PUSH也无济于事。

想了一下决定用自己的服务器接收邮件,然后再推到GMail去,这样就能在可以接受的延迟内享受正常人的垃圾邮件过滤服务。

环境:Ubuntu 19.10

首先需要安装发信环境,因为只是转发,实际发信还是会使用原来的SMTP服务器,所以选择Internet Site后随便设置下即可,注意需要禁止外部访问,不然会被拿来发垃圾邮件。

sudo apt install postfix

之后安装fetchmail来接收邮件
sudo apt install fetchmail
vi /etc/fetchmailrc

>/etc/fetchmailrc
set daemon 30

poll imap.spmode.ne.jp
protocol imap
timeout 30
username "$docomo ID$"
password "$IMAP专用密码$"
is $转发目标地址$
no mimedecode
keep
ssl

然后去/etc/default/fetchmail把START_DAEMON修改为yes,给/etc/fetchmailrc 600权限,最后执行service fetchmail start即可。

其实理论上添加了idle的话,IMAP会保持连接,这样能更快收到信件,然而我测试了下不行,不过30秒一次轮询也没啥太大障碍,其他配置可以参考https://www.fetchmail.info/fetchmail-man.html

参考文章:
http://kuniharumaki.com/2014/01/11/0420/docomo-mail-to-gmail.html
https://k-side.hatenablog.jp/entry/2014/03/18/163721
https://yourpalm.jubenoum.com/entry/archives/2621

基佬App 9Monster API分析

呃,为什么会分析这个呢,是因为上个月去鹿儿岛撸柴犬(https://instagram.com/shibainu_lintaro),然后和饲主在咖啡厅瞎聊的时候顺便抓包看了下,因为他想写个bot刷等级(不是很懂帅哥的想法),而且最近这个App收到的垃圾信息也挺多的,于是掏出某个一直被用错地方的工具抓包。

Start

启动App的时候会向”https://api.ninemonsters.com/initial/get”附上auth_key和version获取基本信息,然而这App最骚的居然他喵的连Session都不弄一个,附上auth_key就能获取数据,安全性约等于0。

返回的包括auth_key的所有者的个人信息,以及小广告和人气用户的信息。所有时间相关都是Unix timestamp+000,只能说骚哭了。

Home

进入主界面后会先向”https://api.ninemonsters.com/push/regist”注册自己的最新地理信息及PUSH用的ID,然后会返回实际地址及记录在系统中的地址(我这种付费用户的功能)

同样的地理数据去掉PUSH用的ID之后向”https://api.ninemonsters.com/location/get”请求附近的基佬,返回JSON里面有附近基佬的public_key和图片信息和距离位置等,而且他喵的还附带图片上传时间!!!依然是Unix timestamp+000,App里提供了根据地图搜索的功能,看了下共用一个Api,增加’longitude”latitude’即可获取对应坐标的列表,根据三点判断距离,你即可获取一个基佬的准确定位(不要乱用谢谢)

Pic

前面拿到的JSON里面都会有图片名字对吧
“https://cdn.ninemonsters.com/images/square/”
“https://cdn.ninemonsters.com/images/original/”
GJ!

Msg

“https://api.ninemonsters.com/message/send”
附上自己的auth_key和对方的public_key即可发送消息,依然没有任何session认证。。。

Like&Breeding

“https://api.ninemonsters.com/breeding/add”
“https://api.ninemonsters.com/like/send”
去掉上面的message即可。。。

总结

抱歉各种实现和安全都太骚了,我没办法总结了(等等感觉暴露了我用基佬App的事情

网易云音乐 Mac 流量分析

最近受不了GitHub上老来问网易云音乐代理的邮件,乘着有空处理了一下Nginx没有配置443端口默认流向(导致所有用了我服务的人访问网页都跳过来了),顺便抓包看看网易云音乐Mac客户端有啥改变。

祭出某个用途歪了的工具,老样子一开头向wanproxy请求获取就近CDN节点,然后主要的’music.163.com’还是跑在http上,客户端有变化的应该就只有’p*.music.126.net’上了https,导致我的专辑封面缓存无法使用。不过目前看样子只要代理主API的话完全没有使用上的问题。

感谢Mac组的码农没搞啥太复杂的验证,iOS那边已经完全跑偏了,不在TUN层坐手脚就别想用。Windows的话暂时没法确认,等过我两天SSD到了之后再抓包看看。

B1/B2 签证美国花旗银行开户记录

拿到10年签证之后,2月底去的美利坚,入境审查官问了我呆多久,我说下周就走,结果还是给了我6个月有效期。这次旅行的主要目的是见见亲戚朋友,然后顺便开户。

在此之前我的美国账户使用的是Union Bank,和日本MUFG是一个集团,所以有很好摸鱼的见证开户,然而毕竟不是一家大银行,或多或少会有点小问题,这次就想着去美国的时候顺便开户的,网上看了很多文章,都说BofA好开,于是主要目的银行就变成BofA了。 Continue reading →

赡养与法

豆瓣上有个叫做「父母皆祸害」的小组,前段时间被二中央点名批评之后关掉了。小组里面充斥着对父母专制的指责,毕竟儒家文化下,以子女无条件服从为根基的家族形态已经持续了几千年,这种明显反「社会」的小组必然会被关闭。
小时候父母关系不和谐,导致部分火气间接地发泄到了我身上,父母离婚后,或多或少的家庭臆想也强加在了我身上。好在现在已经几乎独立(除了部分经济外),抑郁症配合每天的左洛复,让我能好好思考一下亲子关系。

想起我爹,尽是负面的回忆,可能是我有点记仇,幼儿园时候打我妈的场景还历历在目。小学时候他回到了老家做生意,回想起来真的是各种谜,甚至可以归纳为正常人不会这么猛撞地冲回去。现在总结起来,大概是因为他和我相反,非常注重家族观念,以至于让我有一种家族关系大于家庭关系的感觉。
从他回去开始,我就特别开心家里的负能量没了,每天晚上响起的电话机是必须要接的,获得了左耳进右耳出的选择技能。现在我的某些变化,归咎于缺乏父爱也是合情合理的,在成年之后,想要修补这层关系并没有那么容易。

前两天又和我妈吵架,以前还会觉得她嫁给我爹真的是可惜,现在反而觉得真般配啊。由于父亲角色的缺失,小时候99%的时间都是和她生活在一起,用「相依为命」来形容也不为过。但和所有的小朋友一样,我终究会独立生活,这个时候我妈的反应就非常激烈的,从出国前半年每天都要跟我吵架,到现在没事就脑补我毕业后回深圳。现实生活中,比这层关系优先度高的事情太多,也可以说是我冷血吧,至少现在我妈的过激反应都还能在理解范围内。结局无非两个,在经济完全独立后,老死不相往来,亦或者创造个能一起生活的环境,但至少从现在来看,前者的可能性更高一些。

法律

和我妈吵架必然会吵到赡养问题,就算她嘴上怎么说以后不用我养之类的话,我还是会考虑一下社会及法律问题的。

父母有抚养教育未成年子女的义务,成年子女有赡养扶助父母的义务。
中华人民共和国宪法 第四十九条

关于法律问题,和念法学的高中同学好好聊了下,得出的结论是,只要过了20岁(追诉期),就算没有尽到抚养义务,父母也可要求子女赡养或支付赡养费用,而且该条不能通过其他协议来取消掉。大概只有魔幻的贵国会把这种事情写进宪法里了吧。
这个时候就需要把日本拖出来对比一下,毕竟是被美国爸爸吊着打一顿之后写的宪法,肯定是按正常逻辑来的,这种鸡毛蒜皮的家事就归到民法中了。

第八百七十八条  扶養をする義務のある者が数人ある場合において、扶養をすべき者の順序について、当事者間に協議が調わないとき、又は協議をすることができないときは、家庭裁判所が、これを定める。扶養を受ける権利のある者が数人ある場合において、扶養義務者の資力がその全員を扶養するのに足りないときの扶養を受けるべき者の順序についても、同様とする。
(扶養の程度又は方法)
第八百七十九条  扶養の程度又は方法について、当事者間に協議が調わないとき、又は協議をすることができないときは、扶養権利者の需要、扶養義務者の資力その他一切の事情を考慮して、家庭裁判所が、これを定める。
(扶養に関する協議又は審判の変更又は取消し)
第八百八十条  扶養をすべき者若しくは扶養を受けるべき者の順序又は扶養の程度若しくは方法について協議又は審判があった後事情に変更を生じたときは、家庭裁判所は、その協議又は審判の変更又は取消しをすることができる。
(扶養請求権の処分の禁止)

乍一看,日本的覆盖范围比国内广多了啊,不仅父母,连兄弟姐妹也要管,特殊情况下连三等亲也要扶养。但仔细阅读后,日本的法律比国内完善得多,首先扶养不再是以年龄为准,只要有需要,不管什么年龄都有扶养义务,而且仅需要达到不影响抚养人生活的水平即可。

家庭观

至今仍被儒家文化残害的结果,女方要依顺于男方,孩子要依顺于父母,这种风气在当今社会依然盛行。我个人是支持「父母无恩论」,中国文化里常说「身体发肤,受之父母」,要子女感谢父母把自己生下来,无恩论则认为,孩子并没有机会选择降生到这个世界受难,而且生育是父母双方自己的选择,甚至是「意外」,经常能看到国内新闻说小孩感冒用被子捂着到死了,那成为父母的门槛是否也过低了些?
以生物学上来看,生育是一种本能,以延续种族的基因。换种理解方式,对于父母生育自己的感恩,就是养育好下一代。那为什么儒家文化会出现这种往上回报的现象呢?我个人的理解为和养老金制度一样,制定规则的人都是既得利益者。

常常思考一个问题,家是户籍上填写的那个地址?还是每天回去休息的那张床?或是和家人一起生活的空间?
从小到大辗转于各个地方,家这种感觉很陌生,每当适应下来一个地方,就离下一次搬家不远了。这种经历也不全是坏处,我对陌生环境的适应能力强到甚至到了不需要适应的地步,毕竟连家也变得陌生起来。
偶尔会梦到在深圳住过最长时间的那套物业,那个炎热的夏天,过完暑假的我搭长途巴士从老家回到深圳,打开家门的一瞬间,那种家的味道扑面而来,疲累的我直接瘫倒在沙发上。和高原气候的老家不同,深圳显得格外潮湿,然而在离开三周之后,我居然觉得这种空气黏黏的感觉很舒服,整个人瞬间就放松下来,享受着回家的美好。记忆里,大概从那搬出以后,我就再也没有回家的轻松感。
父母离婚后,我和母亲搬到一个店铺,平常睡在二楼,因为开店的缘故,很难有一种隐私感。而且窗户隔音不好,旁边的路上货车又多,我的睡眠质量越来越差,以至于有些神经衰弱。
日本三年间,我已经搬了三次家,总难有一种家的感觉。毕竟是租赁的房子,随时有可能搬走,对未来的迷茫加深了焦虑感。偶尔出去旅游,住在酒店里反而睡得很安稳,睡起来精神充沛。
出国后,母亲搬到了新房,假期中回去过几次,至今依然有一种这是别人的家的感觉,住在里面异常压抑,甚至考虑过不如出去住酒店好了,但碍于我妈的面子,只好稍微忍一忍,白天尽量往外面跑。
改变现状也没那么容易,想来想去错的都是我,谁叫我那么矫情呢?