2020年1月28日星期二

Root Me challenge: Bash-System 1

挑战链接:
https://www.root-me.org/fr/Challenges/App-Script/ELF32-System-1
根据题意,我们的目标是查看/challenge/app-script/ch11/.passwd中的密码。

在ssh连接到的终端上:
首先, ls -l 查看文件及其权限,我们看到:
-r-sr-x--- 说明可执行文件 ch11 在执行时可获取root权限。(这里需要了解real user id, effective user id 和 saved user id, 可参考https://www.itread01.com/p/1387916.html;以及了解setreuid()函数,可参考https://blog.csdn.net/hittata/article/details/8670208

cat ch11.c 可看到ch11.c的内容,即为题目中的代码:
如果直接使用 cat 查看/challenge/app-script/ch11/.passwd 是没有root权限的:

解题思路为:
既然ch11程序拥有root权限,那么如果将代码中的ls替换成cat,就可以查看。然而作为普通用户,对ch11.c没有写权限,所以不能修改c代码。即使可以修改,也没有Makefile的执行权限。
那么我们可以通过修改环境变量PATH,使ls命令实际上执行的是/bin/cat命令。

第一步,将/bin/cat命令复制到/tmp/test/ls:
cp /bin/cat /tmp/test/ls
(注:1. /tmp/ls已存在,不可更改。2. 只有/tmp有写权限,所以将其放在/tmp下。
第二步,修改环境变量,添加路径/tmp/test:
export PATH="/tmp/test:$PATH"
现在代码中的ls将会执行/tmp/test/ls,实际上就是/bin/cat,而不是执行原先的/bin/ls。
执行./ch11,密码就会在终端显示出来了。

作为新手,我还有几个问题有待弄明白:
1. 既然-r-sr-x---文件已经有执行时的root权限了,为何代码中还需要有setreuid()?
 经本地linux实验,如果删除文件中的setreuid(),那么程序将没有root权限。结合之前关于user id的知识推测:
chmod u+s只是saved uid (suid) = owner uid,执行时还需使用setreuid(geteuid(), geteuid()),使real uid = effective uid = saved uid,其中geteuid()返回的就是saved uid的值, 此处若不使real uid = saved uid, 程序也没有root权限。这很奇怪,按理说程序执行时只看effective uid。有待考证若有高人望予指点

2. 普通用户修改环境变量真的也会改变root用户的环境变量吗?
    并不会。
1. 每次打开shell终端,它会加载profile和bashrc文件中的变量。export只改变当前shell的环境变量。
2.  环境变量具有继承性。我们的题目中system(const char *cmd)函数会先调用/bin/sh命令创建一个shell进程,然后让该shell进程运行传入的cmd命令[2]。因为此shell进程会继承其父进程shell的环境变量。

  • 经验教训:

引用挑战页面链接的文章:
[1] “Dangers of SUID Shell Scripts"
[2] "Set-UID Privileged Programs"

  • (被)Set-UID的程序需要注意一些环境变量:
1. PATH:命令路径目录
编程时应指明命令的绝对路径,比如题目中ls应写作/bin/ls。
2. IFS:转义为空格的字符
目前IFS被大多数的shell禁用,子进程也不继承IFS。
3. LD_LIBRARY_PATH: 动态链接库文件路径目录
目前,Set-UID程序链接库文件时会忽略LD_LIBRARY_PATH。安全的程序应设置链接库文件的路径为静态路径。
4. LD_PRELOAD:预先载入库文件路径
目前,Set-UID root程序链接库文件时会忽略LD_PRELOAD,除非real uid也等于0
(具体例子参考[2])

  • 此外,还需注意set-uid程序中system(cmd)的使用,不验证用户的输入参数可使被system()调用的shell执行其他命令。
比如:
// The contents of User_Input are provided by users. 
sprintf(command, "/bin/mail %s", User_Input); 
system(command); 
当用户输入xyz@example.com ; rm -f /* ; /bin/sh时,其它命令被执行。

[2]中还有其他一些命令的漏洞将在另一篇文章中讨论。
[2]中还提到如何改进set-uid程序的安全性以及最小权限原理(Principle of Least Privilege),也在另一篇文章中阐述。

2018年10月11日星期四

法国研究所工作氛围/文化

我在法国实习的能源研究所,是一半由政府出资,一半由企业出资赞助研究的机构。研究所的工作人员总共只有40人左右,包括行政人员、职能人员、研究人员、专家、博士生、实习生和外部技术支持人员。

我的主管是一个女研究员,专门负责我参与的这个研究项目。整个项目组包括我在内其实只有5个人。一个专家,两个研究员,另两个就是实习生。专家只负责整体框架把控和技术难题,一般不会待在研究所;项目的计划、推进是由研究员负责;实习生就是要完成研究员交给的研究任务。我们一起按部就班地推进研究课题。

我十分喜欢这里的工作氛围。

工作的第一天,我的主管就带我到每个办公室,向所有人介绍我以及我的工作内容,办公室的每个人也会向我介绍他们自己以及他们的工作内容。

中午的时候,大家会呼朋引伴地一起到楼下餐厅吃饭。吃饭的时候大家会互相交流各自的课题研究,目前的工作情况、进度等,也会随便聊点什么开开玩笑,不说话也没关系。第一天吃饭的时候我还不太认识人,所以就默默地吃,之后要是有感兴趣的话题我也会参与,虽然法语不太好,还是有法国人能忍受的哈哈。虽然可能听不懂别人的课题的技术细节,但是还是能了解到他们的项目有哪些课题需要研究,也了解到了能源研究的方方面面。我还认识到做成一个研究项目不是一个很简单想当然的事情。每一个提出的疑问都需要阅读大量的文献去寻找答案,或是甚至要做实验来进行猜想的验证。每一个结论的得出都是需要严谨的研究。

前几天有个让我很触动的事,是有一个女研究员修完产假回来上班。我无意看到桌上有一个卡片,印着她儿子的照片,写着她的儿子出生3个月了,特此通知大家。第二天的下午,整个研究所的人就聚集在休息室里,休息室桌子上堆满了大家给她宝宝送的礼物和给她的花束,花束上还有一张写满了大家祝福的卡片。我才知道原来这里有个传统,生完小孩的她回来上班时会写一张卡片告知大家小孩的情况,还会列一张礼物心愿清单。研究所的其他人就会分别认领购买礼物以祝贺她的喜事。

还有个我很欣赏的传统。每个在这里工作的人,在做完一个项目之后,都会开一个茶话会,全部的人都会来参与。这个茶话会是为了介绍给所有人他做完的项目的内容,即使大部分人都不是他的项目组的。这是一个很好的学术交流的传统,也让每个人都能及时了解研究所的情况。

2018年10月6日星期六

python库picos使用问题

In the installation and use of 'picos' to solve optimization prob, I had some troubles, and listed them here.

system: windows 10
python 3.6

  • Problem: 
  • When 'import picos' 'import cvxopt', there is error "import cvxopt.base: the specified module could not be found".
  • Solution: 
  • Package CVXOPT requires numpy+mkl, we need to uninstall the numpy package and reinstall numpy+mkl from :

       http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

  • Problem:
  • When use 'cplex' solver for MIQP model in picos, it throws error 5002: problem is non-convex. 
  • model likes: (x-x_r)'Q(x-x_r), where x is variable and x_r is constant.  
  • Solution:
  • Error caused because I set x_r=prob.add_variable('x_r',x_r), and give it values later by x_r.value=cvxopt.matrix(A). Instead I have to change x_r to parameter by x_r=prob.new_param(cvxopt.matrix(A)) . However, in constraints, a constant can be set as variable.


在安装和使用'picos'来解决优化问题时,我遇到了一些麻烦,并将它们列在这里。

系统:windows 10
python 3.6

问题:
当'import picos''import cvxopt'时,出现错误“import cvxopt.base:找不到指定的模块”。
解:
包CVXOPT需要numpy + mkl,我们需要卸载numpy包并从以下位置重新安装numpy + mkl:


问题:
当在picos中使用'cplex'求解器用于MIQP模型时,它会抛出错误5002:问题是非凸的。
模型像这样:(x-x_r)'Q(x-x_r),其中x是变量,x_r是常量。
解:
错误是因为我设置 x_r为变量:  x_r = prob.add_variable('x_r',x_r),而后赋值x_r.value = cvxopt.matrix(A)给它。 
事实上,我必须通过 x_r =prob.new_param(cvxopt.matrix(A))将x_r更改为参数。
约束中的常量却可以设为variable。

Root Me challenge: Bash-System 1

挑战链接: https://www.root-me.org/fr/Challenges/App-Script/ELF32-System-1 根据题意,我们的目标是查看 /challenge/app-script/ch11/.passwd 中的密码。 在ssh连接...